2

以下代码工作正常

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'

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

4

2 回答 2

2

您正在序列化一个字符串列表。你希望它如何神奇地成为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 基数为基数的整数,而且很幸运它们没有使用字母 AF,该怎么办?

至于你问题的第二部分

(..) 因为它可以直接直接输入?

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

于 2013-02-25T09:54:59.390 回答
0

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

List<int> deserialisedList = new JavaScriptSerializer().Deserialize<List<int>>(serialisedList);
于 2013-02-25T10:01:36.387 回答