将JSON字符串转换为DataTable C#的问题

时间:2017-02-11 15:16:32

标签: c# json

在获取JSON字符串以转换为C#Datatable ...

时遇到问题

以下是从API

返回给我的代码的JSON字符串示例
   {
  "Code": 0,
  "Result": [
    {
      "ID": 1,
      "Reference": "101",
      "Asset": 200,
      "Event": 1,
      "DateEventStart": "2/10/2017 9:08:33 PM",
      "DateEvent": "2/11/2017 1:00:14 AM"
    }
]
}

所以它来自API并且我读了它,然后尝试创建像这样的DataTable

        var response = (HttpWebResponse)httpWebRequest.GetResponse();
        var encoding = Encoding.GetEncoding(response.CharacterSet);
        var responseStream = response.GetResponseStream();
        var reader = new StreamReader(responseStream, encoding);
        responsetext = reader.ReadToEnd();

        var table = JsonConvert.DeserializeObject<DataTable>(responsetext);

然而,这会产生以下错误:

  

读取DataTable时出现意外的JSON令牌。期待StartArray,得到了   在StartObject。路径'',第1行,第1位

我是C#中处理JSON的新手,所以任何帮助都会受到赞赏。我认为我的字符串在某种程度上无法解析它,但我不知道。如果需要更多信息,请告诉我

编辑: 好的,我按照星星乔所说的链接 - 有道理。我现在得到一个不同的错误,我认为这是由于我已经将JSON被反序列化的类放入 -

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   进入类型   'System.Collections.Generic.List`1 [WindowsFormsApplication7.TrackingResponse]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

     

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

     

路径'代码',第1行,第8位。

这是该类......是因为我没有在JSON中包含'Code'和'Result'(参见上面的字符串)

public class TrackingResponse
{
    public string ID { get; set; }
    public string Reference { get; set; }
    public string Asset { get; set; }
    public string Event { get; set; }
    public string DateEventStart { get; set; }
    public string DateEvent { get; set; }

}

1 个答案:

答案 0 :(得分:3)

您的问题是您的根JSON容器不是数组,它是一个对象。正如JSON standard

中所述
  • 数组是有序的值集合。数组以[(左括号)开头,以](右括号)结尾。值以,(逗号)分隔。

  • 对象是一组无序的名称/值对。对象以{(左大括号)开头,以}(右大括号)结束。

Newtonsoft尝试将DataTable(以及类型为IEnumerable, List, and Array的对象)映射到数组,并且由于根容器不是数组,它会因预期而失败StartArray,得到StartObject 错误。

由于根容器是具有两个属性"Code""Result"的对象,因此您需要创建一个POCO以绑定这些属性。现在,"Result" 的值是一个数组,因此可以映射到DataTable,或映射到某个适当的List<T>的{​​{1}}。要生成必要的类,您可以在visual studio中使用代码生成工具,例如http://json2csharp.com/Paste JSON As Classes,并获得类似以下内容(稍微修改以使根对象通用):

T

您现在可以将JSON反序列化为public class Result { public int ID { get; set; } public string Reference { get; set; } public int Asset { get; set; } public int Event { get; set; } public string DateEventStart { get; set; } public string DateEvent { get; set; } } public class RootObject<T> { public int Code { get; set; } public T Result { get; set; } } RootObject<DataTable>

RootObject<List<Result>>

或者

var rootOfList = JsonConvert.DeserializeObject<RootObject<List<Result>>>(responsetext);

示例fiddle