将JSON响应转换为DataTable

时间:2014-07-28 13:01:08

标签: c# json datatable json.net

我在JSON中提供了以下示例响应。我希望能够将它转换为C#DataTable,这样我就可以从那里遍历元素和程序。

{
  "totalItems" : 10,
  "pageSize" : 20,
  "page" : 1,
  "items" : [ {
    "type" : "call",
    "uri" : "http://link.com",
    "created" : "2014-07-28T10:02:48.000+0000",
    "callType" : "external",
    "from" : "01234567891",
    "to" : "01234567892",
    "callId" : "ast01-1406541749.604847",
    "links" : {
      "recordings" : "http://link.com"
    }
  }, {
    "type" : "call",
    "uri" : "http://link.com"
    "created" : "2014-07-22T15:21:02.000+0000",
    "callType" : "external",
    "from" : "01234567895",
    "to" : "01234567898",
    "callId" : "ast02-1406042397.63768",
    "links" : {
      "recordings" : "http://link.com"
    }
  } ],
  "nextPage" : "http://link.com"
}

我正在使用JSON.net。麻烦的是当我使用以下内容转换为DataTable时:

DataTable items = JsonConvert.DeserializeObject<DataTable>(jsonString);

调试器返回..

“读取DataTable时出现意外的JSON令牌:StartObject”

任何想法?

1 个答案:

答案 0 :(得分:1)

由于 L.B 建议你需要创建自定义类并将发布的JSON反序列化为它们而不是DataTable。原因很简单:要将JSON字符串反序列化为DataTable,JSON字符串必须遵循某种特定格式。由于DataTable表示行和列的集合,因此JSON字符串必须表示集合(javascript数组)。 JSON字符串中的所有嵌套对象也必须是javascript数组的一部分,因为内置的DataTableConverter(当您尝试将JSON反序列化为DataTable类型时使用)将无法反序列化JSON字符串。您得到的例外是因为以下行:

"links" : {
      "recordings" : "http://link.com"
    }

如果您将其更改为

"links": [{
                "recordings": "http://link.com"
            }]

您要更接近将其正确反序列化为DataTable

下一步是使整个JSON字符串成为一个javascript数组。像这样:

[{
    "totalItems": 10,
    "pageSize": 20,
    "page": 1,
    "items": [
        {
            "type": "call",
            "uri": "http://link.com",
            "created": "2014-07-28T10:02:48.000+0000",
            "callType": "external",
            "from": "01234567891",
            "to": "01234567892",
            "callId": "ast01-1406541749.604847",
            "links": [{
                "recordings": "http://link.com"
            }]

        },
        {
            "type": "call",
            "uri": "http://link.com",
            "created": "2014-07-22T15:21:02.000+0000",
            "callType": "external",
            "from": "01234567895",
            "to": "01234567898",
            "callId": "ast02-1406042397.63768",
            "links": [{
                "recordings": "http://link.com"
            }]
        }
    ],
    "nextPage": "http://link.com"
}]

在此之后,您可以使用以下行将其反序列化为DataTable

DataTable items = JsonConvert.DeserializeObject<DataTable>(jsonString);

如果无法更改JSON字符串,则必须按照 L.B 的建议将JSON反序列化为自定义类。