在获取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; }
}
答案 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。