2017-07-29 87 views
0

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

+0

能告訴你在「GetUserInformationRequestFromString」的方法獲得了「userInformation」 JSON字符串作爲參數,請屬性你的第二個例子嗎? –

+0

@emkayultra,在.Net和Json.Net的哪個版本中,你是否看到這個問題? –

+0

@JonLopezGarcia - 第一個例子:「{\」TimeStamp \「:null,\」User \「:{\」ID \「:12345,\」LoginName \「:\」username \「}}」} AND second example : 「{\」TimeStamp \「:\」2017-07-29 10:31:53 \「,\」User \「:{\」ID \「:12345,\」LoginName \「:null}}」 – emkayultra

回答

2

如果您還標記,你用戶財產在UserInformationRequest類與[JsonProperty( Required = Required.Always)]屬性,

解串器似乎看起來在UserInformation登錄名成員爲請求非空。

Here你有對用戶財產

+0

看起來它確實有點解決問題。但是,如果我不希望用戶被要求,但如果用戶恰好被提供,那麼它必須具有LoginName – emkayultra

+0

那麼,如果我們仔細考慮,那麼會發生什麼。如果您提供**用戶**屬性,並且所需的屬性位於** LoginName **屬性中,則會引發異常。見[這裏](https://dotnetfiddle.net/Mso1H6)。 如果您在json字符串中不提供** User **屬性,則反序列化器將完全忽略該類中的字段。 如果你不想讓行爲如此,並強制反序列化器在json中查看** User **屬性,這意味着你要填寫字段(換句話說,需要)。使用必需的屬性 –

+0

這很有道理,感謝您的幫助和澄清。標記你的答案爲「答案」。 – emkayultra