簡體   English   中英

將JSON對象反序列化為數組

[英]Deserialization of JSON Object as array

我們有一個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反序列化反序列化第一種格式? 或者有沒有人知道另一個可以解決這個問題的圖書館? 我看了一下這個問題 ,對我來說看起來很可能。

在這里,我找到了另一種方法,好消息是我們不必更改關鍵名稱。

在客戶端創建一個類:

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)鑒於第一個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對象根據數據具有值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM