一个奇怪的错误让我打败了我的脑袋。为了最小化线路上的流量,字段名称被映射和放气,然后在另一端膨胀。如果字段名称是' h'并且数据是日期时间,转换器将崩溃:
Newtonsoft.Json.JsonSerializationException {"错误转换价值9/29/2017 10:06:00 AM键入' System.Double'。路径' dSTD [0] .h',第1行,第293位。"}内部例外,来自'日期时间'到' Double'
在下面的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
答案 0 :(得分:3)
DataTable
个对象中的列名称不区分大小写。发生的事情是您的数据中已经有一个名为H
的列,由于值double
,该列的数据类型设置为1.25
。因此,当h
属性包含一个日期时,Json.Net最终会尝试用它覆盖原始的double值,由于不兼容的类型,它会爆炸。通过将h
更改为hb
,您可以避免此问题,因为现在您的所有列都具有唯一的名称。
这是一个简短的小提琴,演示了这个问题,将Json.Net完全排除在外:https://dotnetfiddle.net/bgmFsB