6
我有一些.NET
代码反序列化JSON
由运行动态语言的webservice
创建的对象。因为源是动态的,所以它有时以浮点格式序列化整数值(例如,2被序列化为“2.0”)。如何在升级Json.NET后恢复int反序列化行为?
与Json.NET 4.0.4
,这无缝工作(似乎舍入被应用时反序列化)。但是,升级到Json.NET 4.5
后,反序列化2.0现在会抛出FormatException
。这里的代码:
// works as expected in both versions
var s = "2";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
// throws FormatException in 4.5 only
var s = "2.0";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
// throws FormatException in 4.5, rounds to 3 in 4.0.4
var s = "2.6";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
有没有简单的方法来恢复原来的行为?理想的行为将是仅对具有整数值的数字进行反序列化,但是以任何格式(例如2.0,1e10,但不是2.5),但我会解决4.0.4行为。
可能需要考虑增加'的objectType == typeof运算(对象)'CanConvert'中,如果目标类“没有指定”实际类型,例如'class MyObject {public object Id; }' – drzaus
@drzaus也许,但要小心。如果你这样做,并且你有任何其他'object'类型的属性都是* not *数字,那么这个转换器将会尝试处理它们,这可能不是你所期待的。你必须添加代码来处理这种情况。 –
对啊,我正在考虑一些[其他答案](http://stackoverflow.com/a/28748973/1037948),它通过检查JTokenType来处理它,如果它不是预期的类型,而不是抛出' FormatException'只返回'serializer.Deserialize(reader)',它似乎将它委托给其他任何应该适当处理它的东西。它在我的测试中工作到目前为止,嵌套的复杂类型。 – drzaus