以下代码可以正常使用
List<string> alist = new List<string>() { "1", "2", "3" };
string serialisedList= (new JavaScriptSerializer()).Serialize( alist );
List<int> deserialisedList= JsonConvert.DeserializeObject<List<int>>( serialisedList);
上例中serialisedList的值为“[\”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'
为什么不能将相同的值反序列化为对象属性,因为它可以直接直接输入到类型中?
答案 0 :(得分:2)
您正在序列化STRINGS列表。你怎么期望它神奇地成为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字段/属性,那么对我来说,这是一个不是特征的错误:)
答案 1 :(得分:0)
如果使用JavaScriptSerializer进行反序列化,它应该可以工作:
List<int> deserialisedList = new JavaScriptSerializer().Deserialize<List<int>>(serialisedList);