2011-05-12 100 views
34

當我可以調用第三方API,並取回一個類有價值的數據都使用此代碼反序列化JSON數組強類型的.NET對象

TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser 

問題是當我嘗試和deserialise deserialises罰款JSON響應的內容,是一個數組,如

{ 
    "data": [ 
     { 
     "name": "A Jones", 
     "id": "500015763" 
     }, 
     { 
     "name": "B Smith", 
     "id": "504986213" 
     }, 
     { 
     "name": "C Brown", 
     "id": "509034361" 
     } 
    ] 
} 

我只能得到序列化,如果我周圍使用「數據」成員定製的包裝類和成員都必須是List<object>類型的工作。如果它們的類型爲List<TheUser>,我從JsonParser DesializeType方法得到ArgumentException

我本來試圖在無包裝類型連載這樣

List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>; 

但只是返回我空集合。當然,我必須能夠將數組反序列化爲強類型列表。

+0

我有同樣的問題;如果反序列化'response'成'dynamic'變種,而不是'TheUser',然後'deserialized.data'可作爲'JArray' - 任何主意,如果你可以轉換成'名單'? – drzaus 2013-01-25 15:43:20

+0

看來你應該能夠([鏈接](http://www.west-wind.com/weblog/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing))。 – drzaus 2013-01-25 16:15:48

回答

27

AFER看着the source,對於WP7吊牀實際上並未使用Json.Net的JSON解析。相反,它使用它自己的解析器,它不能很好地處理自定義類型。

如果直接使用Json.Net,則可能會反序列化爲包裝對象內的強類型集合。

var response = @" 
    { 
     ""data"": [ 
      { 
       ""name"": ""A Jones"", 
       ""id"": ""500015763"" 
      }, 
      { 
       ""name"": ""B Smith"", 
       ""id"": ""504986213"" 
      }, 
      { 
       ""name"": ""C Brown"", 
       ""id"": ""509034361"" 
      } 
     ] 
    } 
"; 

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); 

return des.data.Count.ToString(); 

,並用:

public class MyClass 
{ 
    public List<User> data { get; set; } 
} 

public class User 
{ 
    public string name { get; set; } 
    public string id { get; set; } 
} 

不必創建與數據屬性的額外的對象是小麻煩,但那是的JSON格式的對象的構造方式的結果。

文檔:Serializing and Deserializing JSON

+0

在吊牀上更換DeSerializer非常容易。創建一個實現Hammock.Serialization.IDeserializer接口的類。然後將該類設置爲RestClient上的Deserializer。 – 2011-09-29 14:41:54

+0

我同意這是有點惱人添加額外的對象,所以我下面的解決方案。我的方法也會繞過你,不得不像你在var des =(MyClass)...一樣。不知道這個或我的解決方案是否比其他解決方案更好,只是不需要添加額外的數據對象,我通常會盡量避免類型轉換。 – 2015-03-23 16:59:59

+0

它首先執行一個'Json.Parse(jsonString)''然後做一個'JsonConvert.DeserializeObject(parsedJson [「data」])。ToString())'來最終獲得'User'的列表,表現和理智明智? ;-) – 2017-06-18 14:11:10

8

嘗試

List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response); 
+0

無法編譯,但是是不是隻是會導致相同的基礎mthods一個不同的充調用風格被稱爲以同樣的方式?我不明白怎麼會得到解決我的問題 – 2011-05-13 08:21:16

+3

這個工作對我說:'名單朋友= JsonConvert.DeserializeObject <列表>(響應);' – Homer 2013-01-18 19:28:42

+1

謝謝!這允許我反序列化一個對象數組而不將它們包裝在一個容器對象中。 – masterwok 2015-03-05 04:37:47

0

我懷疑問題是因爲JSON代表與用戶的屬性列表中的對象。嘗試反序列化到這樣的:

public class UsersResponse 
{ 
    public List<User> Data { get; set; } 
} 
2

帕特的JSON結構看起來我描述here問題非常熟悉的 - 對我來說,答案是治療JSON表示作爲字典< TKEY的,TValue >,即使有隻有1個條目。

如果我糾正你的關鍵是字符串類型列表<牛逼>其中T代表類的TheUser「

HTH

PS的價值 - 如果你想更好的系列化PERF退房使用Silverlight Serializer,你需要建立一個WP7版本,無恥插件 - 我寫了一篇關於this的博客文章

7

這個解決方案似乎適用於我,並且無需編寫一堆帶有「Data」的類。

public interface IDataResponse<T> where T : class 
{ 
    List<T> Data { get; set; } 
} 

public class DataResponse<T> : IDataResponse<T> where T : class 
{ 
    [JsonProperty("data")] 
    public List<T> Data { get; set; } 
} 

我應該包括這首先,這裏是一個使用的示例方法上面:

public List<TheUser> GetUser() 
{ 
    var results = GetUserJson(); 
    var userList = JsonConvert.DeserializeObject<DataResponse<TheUser>>(results.ToString()); 

    return userList.Data.ToList(); 
} 
4

這個工作對我反序列化JSON爲對象的數組:

List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response); 
相關問題