Json.Net 无法从动态对象反序列化为可为 nullable<short>
Json.Net can't deserialize from dynamic object to nullable<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 属性 是一个可为 null 的短整数,但是当尝试创建实体的新实例并分配值时,我在尝试分配 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;
An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code
Additional information: Input string was not in a correct format.
据我所知,json 反序列化为 null 值是正确的,并且由于我正在分配一个可为 null 的值,所以我不确定是什么导致了错误?
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);
我将以下 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 属性 是一个可为 null 的短整数,但是当尝试创建实体的新实例并分配值时,我在尝试分配 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;
An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code
Additional information: Input string was not in a correct format.
据我所知,json 反序列化为 null 值是正确的,并且由于我正在分配一个可为 null 的值,所以我不确定是什么导致了错误?
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);