Pat*_*bee 43 c# json.net windows-phone-7 hammock
当我可以调用第三方api并获取单个类的数据时,所有内容都使用此代码进行反序列化
TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化作为数组的JSON响应内容时会出现问题,例如
{
"data": [
{
"name": "A Jones",
"id": "500015763"
},
{
"name": "B Smith",
"id": "504986213"
},
{
"name": "C Brown",
"id": "509034361"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我在"data"成员周围使用自定义包装类并且该成员需要是类型,我只能使序列化工作List<object>.如果它有类型List<TheUser>我ArgumentException从JsonParser DesializeType方法得到它们.
我原本试图在没有像这样的包装类型的情况下进行序列化
List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>;
Run Code Online (Sandbox Code Playgroud)
但这只会给我一个空集合.当然,我必须能够将数组反序列化为强类型列表.
Mat*_*cey 30
在查看源代码时,对于WP7,Hammock实际上并不使用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();
Run Code Online (Sandbox Code Playgroud)
与:
public class MyClass
{
public List<User> data { get; set; }
}
public class User
{
public string name { get; set; }
public string id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
必须使用data属性创建额外的对象很烦人,但这是构造JSON格式化对象的方式的结果.
文档:序列化和反序列化JSON
Fra*_*ank 11
尝试
List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response);
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎对我有用,并且需要编写一堆带有"数据"的类.
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; }
}
Run Code Online (Sandbox Code Playgroud)
我应该首先包含这个,这是一个使用上面的示例方法:
public List<TheUser> GetUser()
{
var results = GetUserJson();
var userList = JsonConvert.DeserializeObject<DataResponse<TheUser>>(results.ToString());
return userList.Data.ToList();
}
Run Code Online (Sandbox Code Playgroud)
这对我有用,可以将JSON反序列化为一个对象数组:
List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101211 次 |
| 最近记录: |