使用newton json在c#中反序列化json的强制转换错误
无法从反序列化json(字典对象)转换为int 代码如下: 假设您有dictionary对象使用newton json在c#中反序列化json的强制转换错误,c#,json,serialization,casting,json.net,C#,Json,Serialization,Casting,Json.net,无法从反序列化json(字典对象)转换为int 代码如下: 假设您有dictionary对象 Dictionary<string, object> dict = new Dictionary<string, object>(); dict.Add("key", 1); 您的号码正在序列化为长(Int64)。试试这个: int value = (int)(long)deserializedData["key"]; 您必须先取消长字符的装箱,然后在取消装箱后将其转换为
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("key", 1);
您的号码正在序列化为长(Int64)。试试这个:
int value = (int)(long)deserializedData["key"];
您必须先取消长字符的装箱,然后在取消装箱后将其转换为整数。如果将上述语句转换为单独的语句,则更有意义:
object oValue = deserializedData["key"];
long longValue = (long)oValue;
int value = (int)longValue;
我认为错误在于JSON.NET假设您提到的数字是long(int64)而不是integer(int32)类型,因此当您对对象进行装箱时,您无法将其直接解装箱到int32,因此您需要更改代码
int i = (int)(long) deserializedData["key"];
因为
反序列化数据[“key”]
的类型是Int64
(您将在调试时看到)。您不能将Int64
强制转换为int
(Int32
)
您可以做什么:
int value = System.Convert.ToInt32(deserializedData["key"]);
反序列化数据[“key”]
中有什么内容(根据调试器,而不仅仅是您所期望的),确切的错误是什么?错误是“指定的强制转换无效”将其转换为Int64是否是Json.net功能。根据答案:Json.net默认情况下将整数值读取为Int64,因为无法知道该值应为Int32还是Int64,并且Int64溢出的可能性较小。对于类型化属性,反序列化程序知道如何将Int64转换为Int32,但由于您的属性是非类型化的,因此您得到的是Int64。[…]这正是Json.NET的工作方式。@stefankmitphint.Parse(someBoxedLong.ToString())
几乎是最低效的工作方式<代码>(int)(long)有些盒子长一些好得多。@phoog很公平,伙计。但是如果您不知道对象的确切类型(在这种情况下是Int64),那么最好使用int.Parse,不是吗?@stefankmitph不,在这种情况下,您应该使用System.Convert类。它将测试装箱对象的运行时类型,并有效地转换它,而不需要经过字符串表示;这是一个运行时异常。当反序列化程序从json中反序列化数字时,它正在创建一个长值。是的,我同意你的看法,json.NET不知道采用哪种类型,所以它采用最大值
int i = (int)(long) deserializedData["key"];
int value = System.Convert.ToInt32(deserializedData["key"]);