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



我有以下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;

mscorlib 中发生了类型为"System.FormatException"的异常.dll但未在用户代码中处理

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

据我所知,json 反序列化为空值是正确的,并且由于我正在分配给可空值,我不确定是什么导致了错误?

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

相关内容

  • 没有找到相关文章

最新更新