【问题标题】:Deserialize JSON with an array of Custom Objects using Json.NET使用 Json.NET 使用自定义对象数组反序列化 JSON
【发布时间】:2012-06-17 13:51:39
【问题描述】:

我收到了一个 JSON 文件,其中包含一个根元素“用户”和一个“用户”项目列表。

我正在尝试将 json 反序列化为名为 User 的自定义类的 List,但我不断收到 JsonSerializationException,它无法覆盖它。

我尝试了以下方法:

代码:

 public class User
{
    public int ID { get; set; }
    public bool Active { get; set; }
    public string Name { get; set; }
}

public class Response
{
    public List<User> Users { get; set; }
    public JObject Exception { get; set; }
}

还有-

public Response DeserializeJSON(string json)
    {
        Response deserialized = JsonConvert.DeserializeObject<Response>(json);
        return deserialized;
    }

JSON:

    {
  "Users": {
        "User": [
          {
            "id": "1",
            "active": "true",
            "name": "Avi"
          },
          {
            "id": "2",
            "active": "false",
            "name": "Shira"
          },
          {
            "id": "3",
            "active": "false",
            "name": "Moshe"
          },
          {
            "id": "4",
            "active": "false",
            "name": "Kobi"
          },
          {
            "id": "5",
            "active": "true",
            "name": "Yael"
          }
        ]
      }
}

抱歉造型不好!!

【问题讨论】:

  • 您确定 JSON 是有效的吗?尝试将其转储到 jsonlint.com 并查看 JSON 本身没有问题。
  • 这是我做的第一件事 :) 确实有效。

标签: json serialization json.net root


【解决方案1】:

在您的 Response 类中,尝试在构造函数中初始化集合。

public class Response
{
    public Response()
    {
        Users = new List<User>();
    }
    public IEnumerable<User> Users { get; set; }
    public JObject Exception { get; set; }
}

【讨论】:

  • 接下来要尝试的是将代码保留在上面,但将集合类型更改为 IEnumerable(在构造函数中保留为 List)。我已经编辑了上面的解决方案
  • 还是不行。在调试时,它确实到达了响应的构造函数,但 List 保持为空。
  • 问题可能出在 JSON 上吗?我现在注意到它实际上是一个“用户”对象,包含一个“用户”对象,该对象包含一个对象数组。也许这就是问题所在?
  • 是 - User 对象中字段名称的大小写错误(应为大写 ID、Active 和 Name),应删除 User - “Users”是集合
  • 我不确定我是否理解,您能否使用正确的代码编辑您的回复?谢谢:)
【解决方案2】:

啊,我需要开始更好地阅读 JSON... :) 我的问题是这个 JSON 字符串实际上有 2 个“包装器”:

根元素是“Users”,其中包含一个名为“User”的元素。 这修复了它:

public class User
{
    public int id { get; set; }
    public bool active { get; set; }
    public string name { get; set; }
}

public class Response
{
    public ResponseContent users { get; set; }
}

public class ResponseContent
{
    public List<User> user;
}

谢谢! :)

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2015-12-05
    相关资源
    最近更新 更多