簡體   English   中英

將JSON字符串轉換為DataTable C#的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM