数据反序列化- 'long'数据类型

本文关键字:数据类型 long 反序列化 数据 | 更新日期: 2023-09-27 18:17:37

我有一个'long'数据类型的类。使用json.net来反序列化包含此对象的web请求(通过webapi传入)。

交货。

公共类Employee{
长id,
字符串名称
}

像下面这样的请求正确地反序列化,

{" id ": " 123 ", "名称":" foo "}
(注意'id'值周围的双引号)

但是像下面这样的请求无法反序列化,

{" id ": 123,"名字":"foo"}

我试着写一个自定义的JsonConverter和重写ReadJson方法将值转换为Int64,但它没有帮助。


更新:也许我的问题过于简单化了。添加更多细节。当类型被用作odata控制器方法

中的参数时,我遇到了这种情况。

公共类mycontroller: odatcontroller
{

[HttpPost]
public void Post([FromBody] Employee newEmp)
{
}
}

当body为

时,接收到newEmp的'null'

{" id ": 123,"名字":"foo"}

我得到一个有效的newEmp对象为主体,如:

{" id ": " 123 ", "名称":" foo "}或
{"name":"foo"}(即不包括id)

数据反序列化- 'long'数据类型

看起来这是经过设计的。当我挖掘modelstate的错误字典时,报告了以下错误。

类型为"Edm"的原始值。十进制'和'Edm。在有效载荷中必须引用Int64'。确保值是引号

根据下面的SO线程,这是odata json的行为。

WinJS data JSON

你应该得到一个很长的,因为json.net假设所有int类型都是Int64。这里是json.net的作者在回应某人要求Int32的评论:

Json。. NET默认将整数值读取为Int64,因为没有Int64方法知道值应该是Int32还是Int64, Int64是不太可能溢出。对于类型化属性,反序列化器知道将Int64转换为Int32,但因为您的属性是未类型化的你得到的是Int64。