使用不带键的c#解析JSON

本文关键字:解析 JSON | 更新日期: 2023-09-27 18:08:46

我一直在使用JSON。. NET之前,我又卡住了,感谢我的最后一个问题,你们帮助我,我成功地完成了我的项目:但是现在我需要反序列化一段没有键的JSON。是的,但它是一个整数,它可以在0到50之间变化,这意味着我不知道怎么做。我试着用字典,但失败得很惨……这里是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
                    }
                }
            }
        }
    }
}
}

(Dat格式…再一次…)

这是我可悲的尝试:

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了,但不明白这个。如有任何友好的回复,我们将不胜感激。

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

使用不带键的c#解析JSON

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

也有很好的文档。你应该没事的:

只是一个简单的例子:

serialize:
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);

你对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

如果你有visual studio 2012,你可以做Edit -> Paste Special -> Paste JSON as Classes,用你的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; }
}