c# - 将 JSON 对象反序列化为 C# 对象时整数列表的反序列化问题

标签 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);

上例中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/

相关文章:

javascript - 在没有 ActiveX 的情况下使用 javascript 启动 word?

c# - 如何从具有 ASPX 扩展名的 URL 提供图像?

c# - 执行 Asyc 时,我可以 "update"ASP UpdateProgress 吗?下载?

c# - 字符串不在正则表达式中

javascript - node-webkit 从外部源运行函数

c# - 适用于所有项目的应用程序范围设置

javascript - 将 javascript 应用程序迁移到使用 AMD 的提示(例如 requirejs)

javascript - Retyped.chartist 用法不清楚。如何创建基本折线图?

c# - LINQ 中的普通 lambda

c# - 在不部署数据库属性的情况下通过代码部署 dacpac