下面的代码可以正常工作
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'
为什么不能将相同的值反序列化为对象属性,因为它可以直接反序列化为类型?
最佳答案
您正在序列化字符串列表。你怎么期望它会神奇地成为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);
至于你的问题:
Why can't the same value be deserialised into an object property (..)
因为底层值类型不匹配。左侧是字符串,右侧是整数。解串器如何知道如何做到这一点?如果字符串不是基于 10 的整数,而是基于 16 的整数,并且幸运的是它们没有使用字母 A-F,该怎么办?
至于问题的第二部分
(..) as it can directly into type directly?
不,不能。如果值类型不匹配,任何合理的往返库都应该抛出异常。如果您的 JSON 处理库允许您将 JSON 值“blargh”分配给 INT 字段/属性,那么对我来说,这是一个错误而不是功能:)
关于c# - 将 JSON 对象反序列化为 C# 对象时整数列表的反序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064152/