JsonConvert.DeserializeObject <dataset>中的错误

时间:2017-10-04 15:09:38

标签: c# json.net

一个奇怪的错误让我打败了我的脑袋。为了最小化线路上的流量,字段名称被映射和放气,然后在另一端膨胀。如果字段名称是&#39; h&#39;并且数据是日期时间,转换器将崩溃:

Newtonsoft.Json.JsonSerializationException {&#34;错误转换价值9/29/2017 10:06:00 AM键入&#39; System.Double&#39;。路径&#39; dSTD [0] .h&#39;,第1行,第293位。&#34;}内部例外,来自&#39;日期时间&#39;到&#39; Double&#39;

在下面的c#示例中,第一组数据(jsonDtA)使转换器崩溃,第二组(jsonDtB)没有崩溃。

string jsonDtA = "{'dSTD':[{'v':'7ac36696-9977-4bf1-b211-1be2a01da04d','av':820210,'l':'72a9f721-86e0-4070-9cd9-dfa9d3c4efdd','ab':726943,'N':1,'A':'Y','B':'N','G':'N','E':'N','D':'N','K':0.0000,'O':1,'L':1.25,'H':1.25,'ac':'ProcessTransaction','ad':5,'ae':'2017-09-29T10:06:00','af':5,'h':'2017-09-29T10:06:00'}]}";
string jsonDtB = "{'dSTD':[{'v':'7ac36696-9977-4bf1-b211-1be2a01da04d','av':820210,'l':'72a9f721-86e0-4070-9cd9-dfa9d3c4efdd','ab':726943,'N':1,'A':'Y','B':'N','G':'N','E':'N','D':'N','K':0.0000,'O':1,'L':1.25,'H':1.25,'ac':'ProcessTransaction','ad':5,'ae':'2017-09-29T10:06:00','af':5,'hb':'2017-09-29T10:06:00'}]}";

DataSet dsA = JsonConvert.DeserializeObject<DataSet>(jsonDtA); 
DataSet dsB = JsonConvert.DeserializeObject<DataSet>(jsonDtB);

唯一的区别是json集中最后一个数据字段的名称,&#39; h&#39;与&#39; hb&#39;

当然我的&#34;修复&#34;就是不要使用&#39; h&#39;在我的通货紧缩地图......

问题是,为什么会发生这种情况,这是一个错误吗?

我使用的是Newtonsoft.Json v10.0.3

1 个答案:

答案 0 :(得分:3)

DataTable个对象中的列名称不区分大小写。发生的事情是您的数据中已经有一个名为H的列,由于值double,该列的数据类型设置为1.25。因此,当h属性包含一个日期时,Json.Net最终会尝试用它覆盖原始的double值,由于不兼容的类型,它会爆炸。通过将h更改为hb,您可以避免此问题,因为现在您的所有列都具有唯一的名称。

这是一个简短的小提琴,演示了这个问题,将Json.Net完全排除在外:https://dotnetfiddle.net/bgmFsB