将JSON对象反序列化为C#对象时,integer List的反序列化问题

本文关键字:对象 反序列化 integer List 问题 JSON | 更新日期: 2023-09-27 18:00:50

以下代码运行良好

List<string> alist = new List<string>() { "1", "2", "3" };
string serialisedList= (new JavaScriptSerializer()).Serialize( alist );
List<int> deserialisedList= JsonConvert.DeserializeObject<List<int>>( serialisedList);

上例中serializedList的值为"[''"1''",''"2''","3''"]">

然后,我有一个JavaScript对象,它有一个属性,该属性是已检查的CheckboxList控件值的数组。当我将此对象转换为JSON时,键值对如下所示:

{
   "SomeProp": "['"1'",'"2'",'"3'"]"
}

所以,这里的值基本上和上面的值完全一样。然而,当我试图将其串行化为C#对象时,因此:

public class ServerObject
{
   public List<int> SomeProp { get; set; }
}
ServerObject deserialisedObj = JsonConvert.DeserializeObject<ServerObject>( jsonString );

我得到错误:

Error converting value "["1","2","3"]" to type 'System.Collections.Generic.List`1[System.Int32]'. Path 'SomeProp'

为什么不能将同一个值取消序列化为对象属性,就像它可以直接序列化为类型一样?

将JSON对象反序列化为C#对象时,integer List的反序列化问题

您正在序列化字符串列表。你怎么会期望它神奇地成为INTS的列表?是的,JSON通常是无类型的,适用于键值对,但对于值,它保留了最基本的格式信息。在JSON中,字符串和数字(以及数组/列表和映射/对象(之间存在区别。查看输出的JSON:

{
   "SomeProp": ["1","2","3"]
}

很明显,这是一个字符串数组。

在JSON中,数字数组看起来像:

{
   "SomeProp": [1,2,3]
}

因此,您必须首先将其序列化为:

List<string> alist = new List<string>() { "1", "2", "3" };
List<int> list2 = alist.Select(str => int.Parse(str)).ToList();
string serialisedList= (new JavaScriptSerializer()).Serialize( list2 );
List<int> deserialisedList= JsonConvert.DeserializeObject<List<int>>( serialisedList);

至于你的问题:

为什么不能将相同的值取消序列化为对象属性(..(

因为基础值类型不匹配。左边是字符串,右边是整数。反序列化程序如何知道如何做到这一点?如果字符串不是基数为10的整数,而是基数为16的整数,并且幸运的是它们没有使用字母A-F,会怎么样?

至于问题的第二部分

(..(因为它可以直接转换成类型吗?

不,它不能。如果值类型不匹配,任何合理的往返库都应该抛出。如果您的JSON处理库允许您将JSON值"blargh"分配给INT字段/属性,那么,对我来说,这是一个错误,而不是特性:(

如果使用JavaScriptSerializer进行反序列化,它应该可以工作:

List<int> deserialisedList = new JavaScriptSerializer().Deserialize<List<int>>(serialisedList);