Json.Net无法从动态对象反序列化为可空<short>

时间:2017-01-18 10:15:30

标签: c# json dynamic json.net nullable

我将以下JSON发送到MVC控制器:

{
  "CId": 374,
  "CultureId": 1,
  "VGS": null,
  "DisplayOrder": 1
}

我正在使用JSON.Net将其转换为动态对象,然后将属性分配到实体中:

public partial class FooEntity
{
    public short DisplayOrder { get; set; }
    public Nullable<short> VGS { get; set; }
    public short CId { get; set; }
    public short CultureId { get; set; }
}

请注意,我们分配的VGS属性是可以为空的,但是当尝试创建实体的新实例并分配值时,我在尝试分配VGS时出错:

dynamic data = JsonConvert.DeserializeObject(payload);
var foo = new FooEntity();
foo.CId = data.CId;
foo.CultureId = data.CultureId;
foo.VGS = data.VGS; // Errors here
foo.DisplayOrder = data.DisplayOrder;
  

类型&#39; System.FormatException&#39;的例外情况发生在mscorlib.dll中但未在用户代码中处理

     

其他信息:输入字符串的格式不正确。

据我所知,json反序列化为空值是正确的,因为我将其赋值为可空值,我不确定导致错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

JSON.Net不知道要解析VGS的内容,这将使其成为object。然后,您无法将object分配给VGS。下面是一个工作示例。它可以通过几种方式解决:

解决方案1 ​​:使用显式转换。

var payload = "{\"CId\": 374, \"CultureId\": 1,\"VGS\": null,\"DisplayOrder\": 1}";
dynamic dyn = JsonConvert.DeserializeObject<FooEntity>(payload);
var foo2 = new FooEntity();
foo.CId = dyn.CId;
foo.CultureId = dyn.CultureId;
foo.VGS = (short?)dyn.VGS; // Note the explicit cast.
foo.DisplayOrder = dyn.DisplayOrder;

解决方案2 :指定类型。

var payload = "{\"CId\": 374, \"CultureId\": 1,\"VGS\": null,\"DisplayOrder\": 1}";
dynamic data = JsonConvert.DeserializeObject<FooEntity>(payload); // Specify type.
var foo = new FooEntity();
foo.CId = data.CId;
foo.CultureId = data.CultureId;
foo.VGS = data.VGS;
foo.DisplayOrder = data.DisplayOrder;

但是根本没有理由使用dynamic。您可以将其直接序列化为您想要的实体。

FooEntity entity = JsonConvert.DeserializeObject<FooEntity>(payload);