无法在C#

时间:2016-05-06 18:11:46

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

我试图在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异常:

  

未处理的类型异常   &#39; Newtonsoft.Json.JsonSerializationException&#39;发生在   Newtonsoft.Json.dll

     

其他信息:无法反序列化当前的JSON对象   (例如{&#34; name&#34;:&#34; value&#34;})进入类型   &#39; System.Collections.Generic.List`1 [ProcessOpenRequests.Program + RootObject]&#39;   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

     

要修复此错误,请将JSON更改为JSON数组(例如   [1,2,3])或更改反序列化类型,使其成为正常的.NET   type(例如,不是像整数这样的基本类型,不是集合类型   像数组或List一样,可以从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; }
        }

2 个答案:

答案 0 :(得分:3)

You are trying to deserialize your JSON into a List<RootObject>. That requires your JSON to be an array, but your JSON is not an array, JSON arrays begin and end with [ and ].

Try desalinizing to a RootObject instead.

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

答案 1 :(得分:0)

所以,这就是发生的事情,我收到的JSON数据的API改变了RootObject,我之前引用了Properties2,我需要更改它以引用Properites。我还必须更改一堆整数现在接收空数据。我反序列化RootObject的原始代码(和Bruno Garcia的答案)再次有效。