2017-07-29 100 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