2016-03-29 106 views
2

現有的基於JSON的Web服務返回相當混亂的JSON對象,其中所有有用的數據都包含在數組的元素中,該數組本身就是1-元素數組。像這樣的東西(我匿名的了,希望沒有錯別字):使用JSON.net將內部數組反序列化爲對象

{"rows":[[ 
    {"name":"John","time":"2016-03-20 01:00:00","id":"2","code":"1234"}, 
    {"name":"Sam","time":"2016-03-20 01:00:00","id":"24","code":"999"}, 
    {"name":"Paul","time":"2016-03-20 01:00:00","id":"12","code":"6512"} 
]]} 

使用JSON.net我需要逐一接入各家的排子元素,但我不知道怎麼了這一點,如果迭代我應該反序列化爲一個具體的類型或只讀取我的json對象的原始數據。

數據將被聚合在一個方法中,因此每個row的'類型'不需要在該方法之外被知道。

rows總是是包含元素數組的一個元素的數組,如圖所示。

回答

2

@ FALS的解決方案應該很好地工作,但如果你想弄死的RootObject,你可以使用Json.Net的LINQ-to-JSON API解析JSON並將數據獲取到易於使用的項目列表中。

假設你有這樣的項目數據中定義的類:

public class Item 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

然後你就可以做到這一點,讓您的產品清單。

List<Item> items = JObject.Parse(json)["rows"][0] 
          .Select(jt => jt.ToObject<Item>()) 
          .ToList(); 

小提琴:https://dotnetfiddle.net/FtB3Cu


如果你想避免聲明任何類,而是使用匿名類型E,你可以將代碼改成這樣:

var items = JObject.Parse(json)["rows"][0] 
        .Select(jt => new 
        { 
         name = (string)jt["name"], 
         time = (DateTime)jt["time"], 
         id = (string)jt["id"], 
         code = (string)jt["code"] 
        }) 
        .ToList(); 

小提琴:https://dotnetfiddle.net/0QXUzZ

+0

謝謝Brian 。有什麼辦法可以進一步將它與方法本地匿名類型結合起來以避免聲明具體類型?還是隻有一個私人的內部類? –

+0

@ Mr.Boy是的,你可以使用匿名類型。我編輯了我的答案以顯示如何。如果您選擇走這條路線,它也應該與內部班級一起工作。 –

+0

輝煌,非常感謝 –

1

這很簡單,你的根對象包含了List<List<>>

你的對象應該是這樣的:

public class InnerObject 
{ 
    public string name { get; set; } 
    public DateTime time { get; set; } 
    public string id { get; set; } 
    public string code { get; set; } 
} 

public class RootObject 
{ 
    public List<List<InnerObject>> rows { get; set; } 
} 

然後使用JSON.NET:

string json = @"{'rows':[[ 
        {'name':'John','time':'2016-03-20 01:00:00','id':'2','code':'1234'}, 
        {'name':'Sam','time':'2016-03-20 01:00:00','id':'24','code':'999'}, 
        {'name':'Paul','time':'2016-03-20 01:00:00','id':'12','code':'6512'} 
       ]]}"; 

var rootObject = JsonConvert.DeserializeObject<RootObject>(json); 

順便說一句,這個網站json2csharp可以從JSON生成C#類,讓生活更加輕鬆:)

編輯:

您也可以使用動態,然後避免解析器從`RootObject:

var rootObject = JsonConvert.DeserializeObject<dynamic>(json); 
rootObject.rows[0] <--- should have what you need 
+0

感謝。有沒有一種簡潔的方法來避免需要'RootObject'而不必手動破解字符串? e..g只需從JSON.net調用中返回一個數組/列表'InnerObject'? –

+0

@ Mr.Boy你可以創建一個自定義的JsonCreationConverter,http://www.newtonsoft.com/json/help/html/DeserializeCustomCreationConverter.htm – Fals

+0

@ Mr.Boy看到上面的編輯,使認爲更動態:) – Fals

相關問題