2016-04-08 161 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的方法...请协助。 –