【问题标题】:Cannot deserialize JSON object in C#无法在 C# 中反序列化 JSON 对象
【发布时间】:2016-05-06 18:11:45
【问题描述】:

我正在尝试在 C# 中反序列化以下 JSON 字符串:

{
  "class": [
    "collection",
    "Request"
  ],
  "properties": {
    "total_hits": 61,
    "total_pages": 61,
    "previous_page": null,
    "next_page": 2,
    "current_page": 1,
    "per_page": 1,
    "params": {
      "limit": "1",
      "client_ids": "1001",
      "is_open": "true"
    }
  },
  "entities": [
    {
      "class": [
        "object",
        "Request"
      ],
      "rel": "/rels/request",
      "href": "/app/requests/745109",
      "properties": {
        "id": 745109,
        "name": "Sidewalk/Curb Repair - 628128",
        "description": "651032 STrevino - We live on a corner lot.  The sidewalks have become increasingly uneven over time, causing standing water at multiple places on the sidewalks.  This also often creates standing mud on the sidewalk particularly after rain.\r\n\r\nCould you please request that they be leveled back to be smooth and even and allow for proper drainage?\r\n\r\nThank Very Much,\r\nAllan Meyer\r\n281-380-7012",
        "created_at": "2015-02-24T02:21:41.000Z",
        "updated_at": "2016-05-06T14:14:53.684Z",
        "creator_id": 1110277,
        "permissions": "This is visible to Sugar Land",
        "comments_count": 12,
        "is_current_user_commenter": false,
        "follows_count": 1,
        "is_current_user_following": false,
        "flags_count": 0,
        "is_current_user_flagger": false,
        "tags_count": 0,
        "average_rating": 0,
        "ratings_count": null,
        "object_fields": [
          {
            "id": 7096,
            "name": "Subdivision (if applicable)",
            "description": "",
            "created_at": "2015-08-20T01:26:43.441Z",
            "updated_at": "2015-08-20T01:26:43.441Z",
            "creator_id": null,
            "permissions": "This is visible to Everyone",
            "display_id": 7096,
            "foreign_ids": [],
            "klass": "RequestType",
            "data_type": "STRING",
            "is_allow_null": false,
            "render_guide": "TEXT",
            "default_value": null,
            "default_permissions": {
              "read": [
                707318
              ],
              "write": [
                707318
              ]
            },
            "object_field_options": []
          },
          {
            "id": 7097,
            "name": "Your Street Number and Street Name (if different location)",
            "description": "",
            "created_at": "2015-08-20T01:26:43.466Z",
            "updated_at": "2015-08-20T01:26:43.466Z",
            "creator_id": null,
            "permissions": "This is visible to Everyone",
            "display_id": 7097,
            "foreign_ids": [],
            "klass": "RequestType",
            "data_type": "STRING",
            "is_allow_null": true,
            "render_guide": "TEXT",
            "default_value": null,
            "default_permissions": {
              "read": [
                707318
              ],
              "write": [
                707318
              ]
            },
            "object_field_options": []
          },
          {
            "id": 7095,
            "name": "Your Contact Number",
            "description": "",
            "created_at": "2015-08-20T01:26:43.420Z",
            "updated_at": "2015-08-20T01:26:43.420Z",
            "creator_id": null,
            "permissions": "This is visible to Everyone",
            "display_id": 7095,
            "foreign_ids": [],
            "klass": "RequestType",
            "data_type": "STRING",
            "is_allow_null": false,
            "render_guide": "TEXT",
            "default_value": null,
            "default_permissions": {
              "read": [
                707318
              ],
              "write": [
                707318
              ]
            },
            "object_field_options": []
          },
          {
            "id": 7094,
            "name": "Your Name",
            "description": "",
            "created_at": "2015-08-20T01:26:43.395Z",
            "updated_at": "2015-08-20T01:26:43.395Z",
            "creator_id": null,
            "permissions": "This is visible to Everyone",
            "display_id": 7094,
            "foreign_ids": [],
            "klass": "RequestType",
            "data_type": "STRING",
            "is_allow_null": false,
            "render_guide": "TEXT",
            "default_value": null,
            "default_permissions": {
              "read": [
                707318
              ],
              "write": [
                707318
              ]
            },
            "object_field_options": []
          }
        ],
        "object_field_instances": [
          {
            "id": 702607,
            "name": null,
            "description": null,
            "created_at": "2015-02-24T13:12:15.000Z",
            "updated_at": "2015-08-20T04:14:39.720Z",
            "permissions": "This is visible to Sugar Land",
            "value": "Magnolia Plantation",
            "object_field_id": 7096
          },
          {
            "id": 702606,
            "name": null,
            "description": null,
            "created_at": "2015-02-24T13:12:15.000Z",
            "updated_at": "2015-08-20T04:14:39.702Z",
            "permissions": "This is visible to Sugar Land",
            "value": "2811 Grassy Knoll Ct.",
            "object_field_id": 7097
          },
          {
            "id": 702605,
            "name": null,
            "description": null,
            "created_at": "2015-02-24T13:12:15.000Z",
            "updated_at": "2015-08-20T04:14:39.682Z",
            "permissions": "This is visible to Sugar Land",
            "value": "281-380-7012",
            "object_field_id": 7095
          },
          {
            "id": 702604,
            "name": null,
            "description": null,
            "created_at": "2015-02-24T13:12:15.000Z",
            "updated_at": "2015-08-20T04:14:39.664Z",
            "permissions": "This is visible to Sugar Land",
            "value": "Allan Meyer",
            "object_field_id": 7094
          }
        ],
        "display_id": 745109,
        "foreign_ids": [],
        "status": "IN_PROGRESS",
        "priority": "MEDIUM",
        "request_type_id": 29119,
        "geo_location_id": 686866,
        "workflow_node_id": 890541,
        "workflow_graph_id": 706096,
        "completed_at": "2015-02-25T16:13:17.000Z",
        "due_at": "2016-05-10T05:00:00.000Z",
        "due_status": "OPEN",
        "client_id": 1001,
        "display_foreign_id": false,
        "api_source_id": 15,
        "is_duplicate": false,
        "is_self_closure_allowed": true,
        "has_duplicates": false,
        "use_permission_matrix": true,
        "request_type_foreign_api_ids": [],
        "primary_attachment_id": null,
        "attachments_count": 0,
        "primary_attachment": null,
        "contact_info": {
          "name": "Allan Meyer",
          "full_name": "Allan Meyer",
          "first_name": "Allan",
          "last_name": "Meyer",
          "username": "allanrmeyer",
          "phone": "",
          "email": "allanrmeyer@gmail.com",
          "user_id": 1110277
        },
        "geo_location": {
          "id": 686866,
          "name": "2811 Grassy Knoll Court, Sugar Land, TX 77478, USA",
          "description": null,
          "created_at": "2015-08-20T04:06:13.717Z",
          "updated_at": "2015-08-20T04:06:13.717Z",
          "creator_id": null,
          "permissions": "This is visible to Everyone",
          "geo_data_id": 738892,
          "postal_address_id": 682944,
          "accuracy_m": null,
          "latitude": 29.585971,
          "longitude": -95.587433,
          "geo_location": {},
          "postal_address": {
            "id": 682944,
            "name": "2811 Grassy Knoll Court, Sugar Land, TX 77478, USA",
            "description": "2811 Grassy Knoll Court, Sugar Land, TX 77478, USA",
            "created_at": "2015-08-20T04:06:13.706Z",
            "updated_at": "2015-08-20T04:06:13.706Z",
            "permissions": "This is visible to Everyone",
            "source": null,
            "street_number": "2811",
            "street_number_unit": null,
            "street_name": "Grassy Knoll Court",
            "postal_code": "77478",
            "region_id": 17622,
            "geo_data_id": null,
            "intersection": null,
            "formatted_address": "2811  Grassy Knoll Court"
          }
        },
        "request_type_name": "Sidewalk/Curb Repair",
        "creator_display_name": "Allan Meyer",
        "api_source_name": "Iframe"
      },
      "actions": []
    }
  ],
  "actions": [],
  "links": [
    {
      "rel": [
        "self"
      ],
      "href": "/app/requests?page=1&limit=1&sort_dir=asc&client_ids=1001&is_open=true"
    },
    {
      "rel": [
        "next"
      ],
      "href": "/app/requests?page=2&limit=1&sort_dir=asc&client_ids=1001&is_open=true"
    }
  ]
}

我创建了以下 RootObject 类来映射 JSON:

 public class RootObject
        {
            public List<string> @class { get; set; }
            public Properties2 properties { get; set; }
            public List<Entity> entities { get; set; }
            public List<object> actions { get; set; }
            public List<Link> links { get; set; }
        }

之前,以下代码用于将 JSON 反序列化为 RootObject:

 var objResponse1 = JsonConvert.DeserializeObject<RootObject>(response2.Content);

但是,我的代码现在抛出 JSON.net 异常:

未处理的类型异常 'Newtonsoft.Json.JsonSerializationException' 发生在 Newtonsoft.Json.dll

附加信息:无法反序列化当前 JSON 对象 (例如 {"name":"value"}) 转换为类型 'System.Collections.Generic.List`1[ProcessOpenRequests.Program+RootObject]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。

要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3]) 或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,不是集合类型 像数组或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。

现在,关于此错误,我已尝试以下方法根据其他 StackOverflow 帖子反序列化 JSON 字符串,但错误仍然存​​在:

var test = JsonConvert.DeserializeObject<List<RootObject>>(response2.Content);

任何帮助将不胜感激。谢谢!

*更新

这里是实体类:

public class Entity
        {
            public List<string> @class { get; set; }
            public string rel { get; set; }
            public Properties2 properties { get; set; }
            public Actions actions { get; set; }
        }

这里是 Properties2 类:

public class Properties2
        {
            public int? id { get; set; }
            public string name { get; set; }
            public string description { get; set; }
            public string created_at { get; set; }
            public string updated_at { get; set; }
            public int? creator_id { get; set; }
            public string permissions { get; set; }
            public int? comments_count { get; set; }
            public bool is_current_user_commenter { get; set; }
            public int? follows_count { get; set; }
            public bool is_current_user_following { get; set; }
            public int? flags_count { get; set; }
            public bool is_current_user_flagger { get; set; }
            public int? tags_count { get; set; }
            public decimal average_rating { get; set; }
            public object ratings_count { get; set; }
            public List<ObjectField> object_fields { get; set; }
            public List<ObjectFieldInstance> object_field_instances { get; set; }
            public int? display_id { get; set; }
            public List<object> foreign_ids { get; set; }
            public string status { get; set; }
            public string priority { get; set; }
            public int? request_type_id { get; set; }
            public int? geo_location_id { get; set; }
            public int? workflow_node_id { get; set; }
            public int? workflow_graph_id { get; set; }
            public object completed_at { get; set; }
            public string due_at { get; set; }
            public string due_status { get; set; }
            public int? client_id { get; set; }
            public bool display_foreign_id { get; set; }
            public int? api_source_id { get; set; }
            public bool is_duplicate { get; set; }
            public bool is_self_closure_allowed { get; set; }
            public bool has_duplicates { get; set; }
            public bool use_permission_matrix { get; set; }
            public List<object> request_type_foreign_api_ids { get; set; }
            public object primary_attachment_id { get; set; }
            public int? attachments_count { get; set; }
            public object primary_attachment { get; set; }
            public ContactInfo contact_info { get; set; }
            public GeoLocation geo_location { get; set; }
            public string request_type_name { get; set; }
            public string creator_display_name { get; set; }
            public string api_source_name { get; set; }
        }

【问题讨论】:

  • 你不应该反序列化到一个列表中——为什么你改变了有效的代码?
  • 该代码不再有效。两个版本都会抛出错误。
  • 这是引发错误的确切消息吗?当您反序列化时: JsonConvert.DeserializeObject(response2.Content);
  • 是的,抛出完全相同的错误。
  • 不可能。可能是类似的。请还原代码并粘贴确切的消息

标签: c# .net json serialization json.net


【解决方案1】:

您正在尝试将您的 JSON 反序列化为 List&lt;RootObject&gt;。这要求您的 JSON 是一个数组,但您的 JSON 不是一个数组,JSON 数组以 [] 开头和结尾。

尝试将海水淡化为RootObject

var test = JsonConvert.DeserializeObject<RootObject>(response2.Content);

【讨论】:

  • 如果您阅读我的 cmets,我之前使用与上面相同的代码进行了此操作,但它不再有效。
  • 注意@SamIam。谢谢
  • @ghoston3rd 您发布的 JSON 不是数组。我无法反序列化为列表。那是导致错误的确切 JSON 吗?
  • @SamIam 请这样做。 Tks
  • 你不喜欢 Firefox 拼写检查器无法识别“反序列化”这个词
【解决方案2】:

所以,这就是发生的事情,我从中接收 JSON 数据的 API 更改了 RootObject 并且我之前引用 Properties2 的位置,我需要将其更改为引用 Properites。我还必须更改一堆整数才能接收空数据。我反序列化 RootObject 的原始代码(以及 Bruno Garcia 的回答)再次有效。

【讨论】:

  • 这是否意味着您发布的 JSON 不是您要反序列化的实际 JSON?
  • 那是我试图反序列化的 JSON。当我第一次为使用 Properties2 而不是 Properties 的 RootObject 类编写代码时,该 JSON 格式从原始格式发生了变化。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-30
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多