将JSON对象反序列化为数组

时间:2014-06-25 10:12:26

标签: c# json json.net

我们有一个JSON结构,我们从服务器向客户端发送一组键值配对。为了简洁和整洁,我们发送如下数据:

"identification": {
    "lineItem/latestDate": "2013-04-28",
    "lineItem/destination": "test",
    "lineItem/quantity": "55"
}

而不是:

"identification": [
    {
        "value": "test",
        "type": "lineItem/destination"
    },
    {
        "value": "2014-07-25",
        "type": "lineItem/latestDate"
    },
    {
        "value": "55",
        "type": "lineItem/quantity"
    }
]

问题是我们的下游客户端(使用C#处理JSON)说他们无法处理第一种格式,因为内置的json.net功能不支持它,他们不知道另一种可以做到这一点

是否可以使用C#中内置的JSON反序列化反序列化第一种格式?或者有没有人知道另一个可以解决这个问题的图书馆?我看了一下这个question对我而言看起来很可能。

3 个答案:

答案 0 :(得分:5)

在这里,我找到了另一种方法,好消息是我们不必更改关键名称。

在客户端创建一个类:

public class RootObject
{
    public Dictionary<string,string> identification { get; set; }
}

现在,反序列化它:

        string data = @"[
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
},
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
},
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
}]";

List<RootObject> ob = JsonConvert.DeserializeObject<List<RootObject>>(data);
宾果,我们又做了。

1)现在,ob对象具有所需的值。

2)使用值数组。

3)也支持迭代。

答案 1 :(得分:4)

1)鉴于第一个JSON无效,在开始时需要左括号,并且从最后删除一个额外的逗号。

2)如果您的客户端可以使用Newtonsoft.Json,您可以在密钥中使用“_”而不是“/”,因为c#中不支持名称中带有“/”的标识符

客户端:

创建类

public class Identification
{
    public string lineItem_latestDate { get; set; }
    public string lineItem_destination { get; set; }
    public string lineItem_quantity { get; set; }
}

public class RootObject
{
    public Identification identification { get; set; }
}

注意:如果您有更多的键/值对,则可以向类标识

添加更多属性

现在,将其反序列化为:

        string data = @"[
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
},
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
},
{
    ""identification"": {
        ""lineItem_latestDate"": ""2013-04-28"",
        ""lineItem_destination"": ""test"",
        ""lineItem_quantity"": ""55""
    }
}]";

        List<RootObject> ob = JsonConvert.DeserializeObject<List<RootObject>>(data);

完成后,现在ob对象根据数据具有值。

答案 2 :(得分:2)

Json.Net DOES支持反序列化键值配对:您只需要使用Dictionary<string, T>,其中T可以是objectJToken或其他类可以接收数据值(string适用于您的情况)。使用字典实际上很容易反序列化和迭代值,如下所示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""identification"": {
                ""lineItem/latestDate"": ""2013-04-28"",
                ""lineItem/destination"": ""test"",
                ""lineItem/quantity"": ""55"",
            }
        }";

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

        foreach (KeyValuePair<string, string> kvp in obj.identification)
        {
            Console.WriteLine("type: " + kvp.Key);
            Console.WriteLine("value: " + kvp.Value);
            Console.WriteLine();
        }
    }
}

class RootObject
{
    public Dictionary<string, string> identification { get; set; }
}

输出:

type: lineItem/latestDate
value: 2013-04-28

type: lineItem/destination
value: test

type: lineItem/quantity
value: 55