c# - JsonConvert.DeserializeObject<Da​​taSet> 中的错误

标签 c# json.net

一个奇怪的错误让我头痛不已。为了最小化线路上的流量,字段名称被映射和缩小,然后在另一端膨胀。如果字段名称是“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.25。因此,当包含日期的 h 属性出现时,Json.Net 最终会尝试用它覆盖原始的 double 值,这会由于类型不兼容而崩溃。通过将 h 更改为 hb 您可以避免这个问题,因为现在您的所有列都具有唯一的名称,这是它们应该的。

这是一个演示问题的 fiddle ,将 Json.Net 完全排除在外:https://dotnetfiddle.net/bgmFsB

关于c# - JsonConvert.DeserializeObject<Da​​taSet> 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568282/

相关文章:

c# - WPF UI 渲染问题

c# - 在 .NET 中使用 PerformanceCounter 测量 CPU 使用率的正确方法

c# - 如何在字体大小改变时调整数据gridview的大小

c# - 使用 Newtonsoft 解析 json 字符串会引发 Null 引用执行

c# - 使用 Newtonsoft 反序列化 JSON 对象 C#

json.net - 从 RavenDB 获取 NServiceBus 订阅

C#,在 teamcity 构建后部署 Windows 任务和服务

c# - ObjectDataSource 在嵌套的 gridview 中多次调用

c# - 将 JavaScriptConverter 转换为 json.net JsonConverter

c# - 使用 Json.NET 的自定义映射