【问题标题】:Json.Net can't deserialize from dynamic object to nullable<short>Json.Net 无法从动态对象反序列化为 nullable<short>
【发布时间】:2017-06-02 16:01:42
【问题描述】:

我将以下 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 属性是一个可以为空的short,但是在尝试创建实体的新实例并分配值时,尝试分配 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.dll 中出现“System.FormatException”类型的异常,但未在用户代码中处理

附加信息:输入字符串的格式不正确。

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

【问题讨论】:

  • 也许VGS 被反序列化为object,这就是为什么你不能将它分配给Nullable&lt;sort&gt;
  • JsonConvert.DeserializeObject(payload);你能用泛型试试吗?
  • 另外,你应该更喜欢short? 而不是Nullable&lt;short&gt;

标签: c# json dynamic json.net nullable


【解决方案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);

【讨论】:

  • 解决方案 2 是不可能的,因为实际的有效负载更复杂,但解决方案 1 有效。谢谢。
  • 第一个解决方案并不能真正解决问题,即使您不指定演员表,它也可以正常工作。 Netwtonsft.Json 具有与大多数内置类型之间的隐式转换运算符,这不是问题。这里的问题是其他问题,但希望第二个问题适用于 OP。
  • 你可以在这里看到JToken几乎所有的隐式转换为内置类型。 github.com/JamesNK/Newtonsoft.Json/blob/…
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 2013-11-14
  • 2015-07-14
  • 2015-04-20
  • 1970-01-01
  • 2014-11-11
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多