Json.NET 反序列化嵌套对象忽略 JsonProperty.Required
Json.NET deserializing nested object ignores JsonProperty.Required
当使用嵌套对象反序列化 JSON 对象时,其中一个嵌套对象具有必需的 属性,反序列化不会抛出异常。但是,如果我将 JsonProperty.Required 装饰添加到基础对象,它就会这样做(如我所料)。当输入字符串的类型完全错误,但格式正确 JSON.
时,就会发生这种情况
因此,有问题的输入是“{\"Errors\":[\"This is an error\"]}”(这是来自网络服务的响应,要么是这样的错误消息数组,要么它是一个正确序列化的 UserInformationRequest)。
澄清代码:
基本对象 JsonProperty 正常运行:
public class UserInformation
{
public string ID;
...
public string LoginName;
...
}
public class UserInformationRequest
{
[JsonProperty(Required = Required.Always)]
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//exception thrown when userInformation.TimeStamp is null, as expected
return null;
}
}
嵌套的 JsonProperty 无法正常运行:
public class UserInformation
{
public string ID;
...
[JsonProperty(Required = Required.Always)]
public string LoginName;
...
}
public class UserInformationRequest
{
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//never gets here - no exception thrown if userInformation.User.LoginName is null
return null;
}
}
鉴于此,当尝试将 Errors 数组反序列化为 UserInformationRequest 时,如果基础对象上有 JsonProperty,则会正确抛出异常,但如果嵌套对象包含 JsonProperty,则永远不会抛出异常。
正在运行的 dotnetfiddles 演示了该问题:
基础对象上的 JsonProperty:https://dotnetfiddle.net/qvyPfP
嵌套对象的 JsonProperty:https://dotnetfiddle.net/M3F0rb
如果你也用 [JsonProperty(Required = Required.Always)]
属性在 UserInformationRequest
class 中标记你的 User
属性 ,反序列化器似乎在 UserInformation
LoginName
成员不是请求的 null
。
Here 你有第二个例子 User
属性
当使用嵌套对象反序列化 JSON 对象时,其中一个嵌套对象具有必需的 属性,反序列化不会抛出异常。但是,如果我将 JsonProperty.Required 装饰添加到基础对象,它就会这样做(如我所料)。当输入字符串的类型完全错误,但格式正确 JSON.
时,就会发生这种情况因此,有问题的输入是“{\"Errors\":[\"This is an error\"]}”(这是来自网络服务的响应,要么是这样的错误消息数组,要么它是一个正确序列化的 UserInformationRequest)。 澄清代码:
基本对象 JsonProperty 正常运行:
public class UserInformation
{
public string ID;
...
public string LoginName;
...
}
public class UserInformationRequest
{
[JsonProperty(Required = Required.Always)]
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//exception thrown when userInformation.TimeStamp is null, as expected
return null;
}
}
嵌套的 JsonProperty 无法正常运行:
public class UserInformation
{
public string ID;
...
[JsonProperty(Required = Required.Always)]
public string LoginName;
...
}
public class UserInformationRequest
{
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//never gets here - no exception thrown if userInformation.User.LoginName is null
return null;
}
}
鉴于此,当尝试将 Errors 数组反序列化为 UserInformationRequest 时,如果基础对象上有 JsonProperty,则会正确抛出异常,但如果嵌套对象包含 JsonProperty,则永远不会抛出异常。
正在运行的 dotnetfiddles 演示了该问题: 基础对象上的 JsonProperty:https://dotnetfiddle.net/qvyPfP 嵌套对象的 JsonProperty:https://dotnetfiddle.net/M3F0rb
如果你也用 [JsonProperty(Required = Required.Always)]
属性在 UserInformationRequest
class 中标记你的 User
属性 ,反序列化器似乎在 UserInformation
LoginName
成员不是请求的 null
。
Here 你有第二个例子 User
属性