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