0

好的,所以我之前一直被 JSON.NET 困住,但我又被困住了,多亏了你们帮助我的最后一个问题,我成功地完成了我的项目:3。但是现在我需要反序列化一段实际上没有密钥的 JSON。好吧,但它是一个整数,它可以在 0 - 50 之间变化,这意味着我不知道如何做到这一点。我尝试使用 IDictionary,但失败得很惨……无论如何,这是 JSON:

{
"response": {
    "success": 1,
    "current_time": 1362339098, // this will return the time when cache was generated
    "prices": {
        "35": { // defindex
            "11": { // quality
                "0": { // price index ( crate # or unusual effect, 0 when not used )
                    "current": { // current price
                        "currency": "keys",
                        "value": 39,
                        "value_high": 41,
                        "date": 1357515306 // date when the price was updated
                    },
                    "previous": { // previous price
                        "currency": "keys",
                        "value": 37,
                        "value_high": 39
                    }
                }
            },
            "3": { // quality
                "0": { // price index
                    "current": {
                        "currency": "metal",
                        "value": 0.33,
                        "value_high": 0.66
                    }
                }
            }
        },
        "5002": { // refined metal, useful for converting usd prices into metal
            "6": {
                "0": {
                    "current": {
                        "currency": "usd",
                        "value": 0.39,
                        "value_high": 0.42,
                        "date": 1358090106
                    }
                }
            }
        },                          
        "5022": { // one of the crate defindex
            "6": {
                "1": { // crate #1
                    "current": {
                        "currency": "metal",
                        "value": 1.33,
                        "value_high": 1.55,
                        "date": 1357515175
                    }
                }
            }
        }
    }
}
}

(数据格式......再次......)

这是我可悲的尝试:

public class Json1 {
    public Json2 response { get; set; }
}
public class Json2 {
    public int success { get; set; }
    public string current_time { get; set; }
    public IDictionary<int, Json3> prices { get; set; }
}
public class Json3 {

}
public class Json4 {

}
public class Json5 {
    public Json6 current { get; set; }
}
public class Json6 {
    public string currency { get; set; }
    public string value { get; set; }
    public string value_high { get; set; }
}

Json 3 和 4 是空的,因为我不断删除以尝试不同的东西......

但是,是的......我已经习惯了 json,但无法弄清楚这一点。任何友好的回应都非常感谢提前。

(我知道我在一些浮点数和长整数上使用了字符串,这是故意的,但我想可以更改)

4

3 回答 3

2

我个人使用 Newtonsoft.Json 非常好,你可以在http://json.codeplex.com/找到它, 它处理许多其他东西之间的匿名类型和 linq。

还有一个很好的文档。你应该没问题:

只是一个简单的例子:

序列化:

var listId = new List<int>();
listId.Add(1);
listId.Add(2);
listId.Add(3);
String jsonList = JsonConvert.SerializeObject(listId);

反序列化:

List<int> listID = JsonConvert.DeserializeObject<List<int>>(JsonListOfID);
于 2013-04-11T18:29:26.123 回答
1

如果你有 Visual Studio 2012,你可以编辑 -> 选择性粘贴 -> 将 JSON 粘贴为类,它会用你的 JSON 生成它。尽管在这种情况下,这可能对您没有帮助,因为属性名称是动态的。也许结构有帮助。另一种选择可能是将响应解析为 JToken,然后使用 linq 获取数据。

public class Rootobject
{
public Response response { get; set; }
}

public class Response
{
public int success { get; set; }
public int current_time { get; set; }
public _35 _35 { get; set; }
public _5002 _5002 { get; set; }
public _5022 _5022 { get; set; }
}

public class _35
{
public _11 _11 { get; set; }
public _3 _3 { get; set; }
}

public class _11
{
public _0 _0 { get; set; }
}

public class _0
{
public Current current { get; set; }
public Previous previous { get; set; }
}

public class Current
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
public int date { get; set; }
}

public class Previous
{
public string currency { get; set; }
public int value { get; set; }
public int value_high { get; set; }
}

public class _3
{
public _01 _0 { get; set; }
}

public class _01
{
public Current1 current { get; set; }
}

public class Current1
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
}

public class _5002
{
public _6 _6 { get; set; }
}

public class _6
{
public _02 _0 { get; set; }
}

public class _02
{
public Current2 current { get; set; }
}

public class Current2
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}

public class _5022
{
public _61 _6 { get; set; }
}

public class _61
{
public _1 _1 { get; set; }
}

public class _1
{
public Current3 current { get; set; }
}

public class Current3
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}
于 2013-04-11T18:30:55.333 回答
1

你在正确的轨道上IDictionary。这个 JSON 结构实际上是一堆嵌套的字典。尝试像这样制作您的课程:

public class Json1
{
    public Json2 response { get; set; }
}
public class Json2
{
    public int success { get; set; }
    public string current_time { get; set; }
    public IDictionary<int, IDictionary<int, IDictionary<int, Json5>>> prices { get; set; }
}
public class Json5
{
    public Json6 current { get; set; }
}
public class Json6
{
    public string currency { get; set; }
    public string value { get; set; }
    public string value_high { get; set; }
}

你可以像这样反序列化它:

Json1 obj = JsonConvert.DeserializeObject<Json1>(json);

反序列化后,您可以获得如下值:

foreach (KeyValuePair<int, IDictionary<int, IDictionary<int, Json5>>> price in obj.response.prices)
{
    Console.WriteLine("price index: " + price.Key);
    foreach (KeyValuePair<int, IDictionary<int, Json5>> quality in price.Value)
    {
        Console.WriteLine("\t quality: " + quality.Key);
        foreach (KeyValuePair<int, Json5> index in quality.Value)
        {
            Console.WriteLine("\t\t index: " + index.Key);
            Console.WriteLine("\t\t\t currency: " + index.Value.current.currency);
            Console.WriteLine("\t\t\t value: " + index.Value.current.value);
            Console.WriteLine("\t\t\t value_high: " + index.Value.current.value_high);
        }
    }
}

上述输出(以表明它有效):

price index: 35
        quality: 11
                index: 0
                        currency: keys
                        value: 39
                        value_high: 41
        quality: 3
                index: 0
                        currency: metal
                        value: 0.33
                        value_high: 0.66
price index: 5002
        quality: 6
                index: 0
                        currency: usd
                        value: 0.39
                        value_high: 0.42
price index: 5022
        quality: 6
                index: 1
                        currency: metal
                        value: 1.33
                        value_high: 1.55
于 2013-04-15T20:02:56.527 回答