将JSON对象反序列化为C#Object时,使用整数List进行反序列化问题

时间:2013-02-25 09:50:13

标签: c# javascript asp.net json

以下代码可以正常使用

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'

为什么不能将相同的值反序列化为对象属性,因为它可以直接直接输入到类型中?

2 个答案:

答案 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);