将JSON数组反序列化为强类型.NET对象

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>ArgumentExceptionJsonParser 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)

  • 这对我有用:`List <TheUser> friends = JsonConvert.DeserializeObject <List <TheUser >>(response);` (4认同)

Eri*_*own 7

这个解决方案似乎对我有用,并且需要编写一堆带有"数据"的类.

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)


Hom*_*mer 7

这对我有用,可以将JSON反序列化为一个对象数组:

List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);
Run Code Online (Sandbox Code Playgroud)


bob*_*h75 7

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)