Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将JSON响应转换为DataTable_C#_Json_Datatable_Json.net - Fatal编程技术网

C# 将JSON响应转换为DataTable

C# 将JSON响应转换为DataTable,c#,json,datatable,json.net,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" : "e

我用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);
DataTableItems=JsonConvert.DeserializeObject(jsonString);
调试器返回

“读取DataTable:StartObject时出现意外的JSON标记”

任何人有什么想法吗?

正如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);
DataTableItems=JsonConvert.DeserializeObject(jsonString);

如果更改JSON字符串不是一个选项,那么您必须按照L.B建议将JSON反序列化为自定义类。

为什么不简单地将JSON转换为一些具体类而不是DataTable?看看我如何将每个元素推入类中?我将通过粘贴到在线工具中来验证JSON字符串,例如“@Adam92”之后似乎缺少逗号,让我链接的站点创建类,然后调用
JsonConvert.DeserializeObject(jsonString)我有一个类似的问题。。如果我将Json从一个以字符串形式读入的文件转换为datatable,它可以正常工作,但是如果我从httpclient的字符串转换,我会得到与op相同的错误,只需要检查数据,所以我不想创建一堆具体的类,然后在上面构建查看器。我只想创建一个datatable并将其传递给gridview