当使用嵌套对象反序列化一个JSON对象并在其中一个嵌套对象上具有必需的属性时,Deserialize不会引发异常。但是,如果我将JsonProperty.Required装饰添加到基础对象,它会(如我所料)。当输入字符串是完全错误的类型,但格式正确的JSON时会发生这种情况。Json.NET反序列化嵌套对象忽略JsonProperty.Required
所以,有问题的输入是“{\”Errors \“:[\”This is a error \“]}”(这是来自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;
}
}
鉴于此,试图将错误阵列反序列化到UserInformationRequest时,一个如果基础对象上存在JsonProperty,则会正确引发异常,但如果嵌套对象包含JsonProperty,则永远不会抛出异常。
工作dotnetfiddles演示该问题: JsonProperty基础对象:https://dotnetfiddle.net/qvyPfP JsonProperty嵌套的对象:https://dotnetfiddle.net/M3F0rb
能告诉你在“GetUserInformationRequestFromString”的方法获得了“userInformation” JSON字符串作为参数,请属性你的第二个例子吗? –
@emkayultra,在.Net和Json.Net的哪个版本中,你是否看到这个问题? –
@JonLopezGarcia - 第一个例子:“{\”TimeStamp \“:null,\”User \“:{\”ID \“:12345,\”LoginName \“:\”username \“}}”} AND second example : “{\”TimeStamp \“:\”2017-07-29 10:31:53 \“,\”User \“:{\”ID \“:12345,\”LoginName \“:null}}” – emkayultra