JsonConvert.DeserializeObject中的错误
一个奇怪的错误让我跳动了脑袋。为了最大限度地减少通信线路上的通信量,映射和缩小,然后在另一端膨胀。如果字段名称为'h'且数据为日期时间,转换器将崩溃:JsonConvert.DeserializeObject中的错误<DataSet>
Newtonsoft.Json.JsonSerializationException {“Error conversion value 9/29/2017 10:06:00 AM to type' System.Double'。Path'dSTD [0] .h',第1行,位置293.“},其中一个从'DateTime'到'Double'的Invalid强制转换的内部异常。
在下面的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”我通缩图...
问题是,为什么会发生这种情况,它是一个错误?
我使用DataTable
对象Newtonsoft.Json v10.0.3
列名不区分大小写。现在发生的情况是,您的数据中已经有一个名为H
的列,并且由于值为1.25
,该列的数据类型将设置为double
。所以当h
属性出现包含日期时,Json.Net最终会尝试用它覆盖原始的double值,由于不兼容的类型而导致该值被吹掉。通过将h
更改为hb
,可以避免此问题,因为现在所有列都具有唯一的名称,因为它们应该如此。
下面是一个简短的小提琴这表明了问题,采取Json.Net出完全的等式:https://dotnetfiddle.net/bgmFsB
谢谢Brian。来自c#的我的大脑假定区分大小写,我的缩小和膨胀是为了简洁起见,所以混合上限和下限保持字符数减少。非常适用于充气/放气,但结合了大小写不敏感的序列化。谢谢你把我的头拧回来了:) –
不用担心; DataTable列名应该不区分大小写,并不直观,我在MS文档中找不到任何明确说明它们的东西。所以确认的唯一方法是通过实验。它可能会回到DataTables用于镜像SQL表的事实,并且这些表默认情况下不区分大小写,至少在SQL Server中是这样。无论如何,很高兴我能帮助解决这个谜团。 –
看起来无论你反序列化“H”值是'double'不是'日期时间'这似乎是问题。这很可能不是Json.NET中的错误,而是您的代码中的错误。 – TylerBrinkley