一个奇怪的错误让我头痛不已。为了最小化线路上的流量,字段名称被映射和缩小,然后在另一端膨胀。如果字段名称是“h”并且数据是日期时间,转换器将崩溃:
Newtonsoft.Json.JsonSerializationException {“将值 9/29/2017 10:06:00 AM 转换为类型‘System.Double’时出错。路径‘dSTD[0].h’,第 1 行,位置 293。”} 内部异常为 Invalid cast from 'DateTime' 到 '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 集中最后一个数据字段的名称,'h' 与 'hb'
当然,我的“解决办法”就是不在通货紧缩图中使用“h”……
问题是,为什么会出现这种情况,是不是bug?
我正在使用 Newtonsoft.Json v10.0.3
最佳答案
DataTable
对象中的列名不区分大小写。发生的情况是您的数据中已经有一个名为 H
的列,并且由于值 ,该列的数据类型被设置为
。因此,当包含日期的 double
>1.25h
属性出现时,Json.Net 最终会尝试用它覆盖原始的 double 值,这会由于类型不兼容而崩溃。通过将 h
更改为 hb
您可以避免这个问题,因为现在您的所有列都具有唯一的名称,这是它们应该的。
这是一个演示问题的 fiddle ,将 Json.Net 完全排除在外:https://dotnetfiddle.net/bgmFsB
关于c# - JsonConvert.DeserializeObject<DataSet> 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568282/