使用嵌套对象反序列化JSON对象时,在其中一个嵌套对象上使用required属性,Deserialize不会抛出异常。但是,如果我将JsonProperty.Required装饰添加到基础对象,它会(如我所料)。当输入字符串是完全错误的类型,但格式正确的JSON时会发生这种情况。
所以,有问题的输入是“{\”Errors \“:[\”这是一个错误\“]}”(这是来自webservice的响应,要么是这样的错误消息数组,要么就是一个正确序列化的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
答案 0 :(得分:2)
如果您还在User
类中使用UserInformationRequest
属性标记了[JsonProperty(Required = Required.Always)]
属性,则反序列化器似乎会在UserInformation
内查找LoginName
根据要求,}成员不是null
。
Here您的第二个示例包含User
属性