2016-04-08 160 views
0

我想將Json轉換爲DataTable。將jsonArray轉換爲DataTable時發現成功。然而轉換JSON字符串(下面)時:將Json字符串轉換爲DataTable

var r = {'ASSOCIATION_ID':61.0,'DESCRIPTION':'fssESTf64 - false','ACTIVE':true,'MODEL_TYPE':'0','SEARCH_TYPE':'false','CREATED_BY':'1090323','CREATED_DATE':'2015-09-17T14:41:20','LAST_UPDATED_BY':'1090323','LAST_UPDATED_DATE':'2016-02-26T15:55:54'} 

我得到一個錯誤爲{ 「讀取數據表時意外的JSON令牌預期StartArray,得到了在StartObject路徑 '',第1行,位置1。」}

我的代碼很簡單:

DataTable a = JsonConvert.DeserializeObject<DataTable>(r); 

請協助。

+1

「預期StartArray」意味着該函數需要一個對象數組,而不是單個對象。 – CooncilWorker

+0

您似乎有權訪問您要返回的數據。爲什麼不只是序列化一個包含這些數據的DataTable呢? – terbubbs

+1

DataTable序列化爲包含鍵/值對的對象數組,如下所示:[Serialize a DataSet](http://www.newtonsoft.com/json/help/html/SerializeDataSet.htm)。你的JSON是一個單一的對象。你想要什麼 - 一行「DataTable」? – dbc

回答

0

您的根目錄JSON容器是一個對象(由大括號包圍的逗號分隔鍵/值對的無序集合 - {})。 Json.NET將DataTable序列化爲數組對象(由方括號[]包圍的以逗號分隔的令牌的有序集合),每行有一個數組條目,如Serialize a DataSet所示。即下列可以解串作爲一個數據表中:

[ 
    { 
    "ASSOCIATION_ID": 61.0, 
    "DESCRIPTION": "fssESTf64 - false", 
    "ACTIVE": true, 
    "MODEL_TYPE": "0", 
    "SEARCH_TYPE": "false", 
    "CREATED_BY": "1090323", 
    "CREATED_DATE": "2015-09-17T14:41:20", 
    "LAST_UPDATED_BY": "1090323", 
    "LAST_UPDATED_DATE": "2016-02-26T15:55:54" 
    } 
] 

因此你的JSON不能自動給DataTable通過Json.NET映射。

如果你願意,你可以將你的JSON對象反序列化爲一行DataTable。爲了做到這一點,將其加載到一箇中間JToken,檢查是否它是一個對象,而不是一個數組,並且如果是,在陣列中包裹它,然後反序列化:

var token = JToken.Parse(r); 

if (token.Type == JTokenType.Object) 
    token = new JArray(token); 

var a = token.ToObject<DataTable>(); 
+0

謝謝,我可以添加「[」和「]」前後,並使用JArray本身進行轉換,對嗎? –

+0

我想你甚至可以做'JsonConvert.DeserializeObject (「[」+ r +「]」);'但是檢查'r'是否是一個數組或對象,而不是假設它不是一個陣列。 – dbc

+0

是的,我正在檢查。還有一種情況,是否有解析包含特殊字符(如?,#,...)的json的方法...請協助。 –