[英]Issue converting JSON string to DataTable C#
在獲取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類型(例如,不是像整數這樣的基本類型,而不是類似的集合類型可以從JSON對象反序列化的數組或List。 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; }
}
您的問題是您的根JSON容器不是數組,它是一個對象。 如JSON標准中所述 :
數組是有序的值集合。 數組以[
(左括號)開頭,以]
結尾(右括號)。 值由分開,
(逗號)。
對象是一組無序的名稱/值對。 對象以{
(左括號)開頭,以}
結尾(右大括號)。
Newtonsoft嘗試將DataTable
(以及IEnumerable,List和Array類型的對象)映射到數組,並且由於根容器不是數組,它會因預期的StartArray失敗而出現StartObject錯誤。
由於根容器是具有"Code"
和"Result"
兩個屬性的對象,因此需要創建要綁定這些屬性的POCO。 現在, "Result"
的值是一個數組,因此可以映射到DataTable
,或者映射到List<T>
以獲得適當的T
。 要生成必要的類,您可以在visual studio中使用代碼生成工具(如http://json2csharp.com/或粘貼JSON As Classes)並獲取類似以下內容(稍微修改以使根對象通用):
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; }
}
您現在可以將JSON反序列化為RootObject<DataTable>
或RootObject<List<Result>>
:
var rootOfList = JsonConvert.DeserializeObject<RootObject<List<Result>>>(responsetext);
要么
var rootOfTable = JsonConvert.DeserializeObject<RootObject<DataTable>>(responsetext);
DataTable table = rootOfTable.Result;
樣品小提琴 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.