當使用嵌套對象反序列化一個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