Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用newton json在c#中反序列化json的强制转换错误_C#_Json_Serialization_Casting_Json.net - Fatal编程技术网

使用newton json在c#中反序列化json的强制转换错误

使用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"]; 您必须先取消长字符的装箱,然后在取消装箱后将其转换为

无法从反序列化json(字典对象)转换为int

代码如下:

假设您有dictionary对象

 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的工作方式。@stefankmitph
int.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"]);