【问题标题】:Deserialize JSON to an array of objects, instead of to one object list将 JSON 反序列化为一组对象,而不是一个对象列表
【发布时间】:2016-11-14 17:53:38
【问题描述】:

对于可能令人困惑的标题,我们深表歉意。我是 JSON 新手,我正在使用一个与 API 接口的软件开发一个 Web 应用程序。我可以控制两者。

我的应用程序需要枚举“客户”及其“项目”的列表。目前它返回以下内容:

{
  "clients": [
    {
      "client_id": "1",
      "client_name": "Client1",
      "projects": [
        {
          "client_project_id": "1",
          "client_project_title": "WidgetsA",
          "client_project_client": "1",
          "client_project_status": "1"
        },
        {
          "client_project_id": "11",
          "client_project_title": "WidgetsB",
          "client_project_client": "1",
          "client_project_status": "1"
        }
      ]
    },
    {
      "client_id": "11",
      "client_name": "Client11",
      "projects": [
        {
          "client_project_id": "31",
          "client_project_title": "Install",
          "client_project_client": "11",
          "client_project_status": "1"
        }
      ]
    },
    {
      "client_id": "21",
      "client_name": "Client21",
      "projects": [
        {
          "client_project_id": "61",
          "client_project_title": "Marketing",
          "client_project_client": "21",
          "client_project_status": "1"
        }
      ]
    },
    {
      "client_id": "31",
      "client_name": "Client31",
      "projects": [
        {
          "client_project_id": "71",
          "client_project_title": "Fire Everyone",
          "client_project_client": "31",
          "client_project_status": "1"
        },
        {
          "client_project_id": "81",
          "client_project_title": "Buy A Company",
          "client_project_client": "31",
          "client_project_status": "1"
        }
      ]
    }
  ]
}

我可以使用以下 JSON.NET 代码轻松地将其反序列化为一个对象:

MyObject result = JsonConvert.DeserializeObject<MyObject>(response);

但是,这只适用于我的对象如下所示:

  [Serializable, JsonObject]
    internal class MyObject
    {
        [JsonProperty("clients")]
        internal List<ClientObject> ClientList = new List<ClientList>();
    }


 internal class ClientObject
    {

        [JsonProperty("client_id")]internal string ClientID { get; set; }

        [JsonProperty("client_name")] internal string ClientName { get; set; }

        [JsonProperty("projects")] internal List<ProjectObject> ProjectList = new List<ProjectObject>();
    }

(注意:出于隐私考虑,我更改了很多属性和对象的名称,如有任何错误,敬请见谅)

我真正想做的是使用以下代码:

List<ClientObject> result = JsonConvert.DeserializeObject<List<ClientObject>>(response);

但无论我如何格式化 JSON 响应,JSON.NET 都会抛出一个错误,指出 JSON 不是数组。谁能告诉我哪里出错了,或者我误解了什么?

【问题讨论】:

  • 的json字符串不是数组。
  • 您的 json 格式是“对象”格式 - {"clientList": [ {client1properties}, {client2properties}] }。您需要将返回的 json 更改为集合格式 [{client1properties}, {client2properties}]

标签: c# json json.net


【解决方案1】:

正如其他人所提到的,您的 JSON 是一个对象,而不是数组,因此它不能直接反序列化为列表。

但您仍然可以使用 LINQ to JSON 从 JSON 获取您的客户列表:

string json = @"...";
JObject data = JObject.Parse(json);
List<ClientObject> clients = data["clients"].Select(c => c.ToObject<ClientObject>()).ToList();

【讨论】:

    【解决方案2】:

    您的 JSON 是一个对象,其中包含一个作为数组的字段。不能直接转成数组。

    我想你可以使用这个 JSON:

    [
        {
          "client_id": "1",      
        },
        {
          "client_id": "2",      
        }
    ]
    

    但是说真的,拥有一个包含数组的正确响应对象并没有什么坏处。我宁愿我们。

    【讨论】:

    • 这两种方法有什么特别的优点/缺点吗?
    • 不,我猜不是。这只是风格问题,我想我更喜欢更明确的(例如,您可以使用名称,即 clients 在您的情况下)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2012-03-07
    相关资源
    最近更新 更多