将JSON数组反序列化为强types的.NET对象

当我可以调用第三方api并获得单个类的数据时,所有的反序列化都可以使用这个代码

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

当我尝试并反序列化一个数组的JSON响应内容时,问题就来了

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

我只能得到序列化工作,如果我使用“数据”成员周围的自定义包装类,该成员需要是types的List<object> 。 如果它有他们作为typesList<TheUser>我从JsonParser DesializeType方法得到ArgumentException

我原本试图没有像这样的包装types连载

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

但是这只是给我一个空的集合。 当然,我必须能够将数组反序列化为强types列表。

查看源代码 ,对于WP7 Hammock实际上并不使用Json.Net来进行JSONparsing。 相反,它使用它自己的parsing器,它不能很好地处理自定义types。

如果直接使用Json.Net ,则可能会反序列化为包装对象内的强types集合。

 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; } } 

不得不用data属性创build额外的对象是令人讨厌的,但这是JSON格式化对象构造的结果。

文档: 序列化和反序列化JSON

尝试

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

这个解决scheme似乎为我工作,并得到无处不在编码一堆与他们“数据”类。

 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(); } 

这对我来说反序列化JSON到一个对象数组:

 List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response); 

Json.NET – 文档

http://james.newtonking.com/json/help/index.html?topic=html/SelectToken.htm

对作者的解释

 var o = JObject.Parse(response); var a = o.SelectToken("data").Select(jt => jt.ToObject<TheUser>()).ToList(); 

Pat,json结构看起来对我在这里描述的问题非常熟悉 – 对我来说,答案是将json表示作为Dictionary <TKey,TValue>处理,即使只有1个条目。

如果我是正确的,你的键是stringtypes和List <T>的值,其中T代表类'TheUser'

HTH

PS – 如果你想使用Silverlight Serializer更好的序列化检查,你需要build立一个WP7版本,无耻的插件 – 我写了一篇关于这个

我怀疑这个问题是因为json代表一个对象的用户列表作为属性。 尝试反序列化的东西,如:

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