Json.NET反序列化嵌套对象忽略JsonProperty.Required

时间:2017-07-29 14:36:01

标签: c# .net json json.net json-deserialization

使用嵌套对象反序列化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

1 个答案:

答案 0 :(得分:2)

如果您还在User类中使用UserInformationRequest属性标记了[JsonProperty(Required = Required.Always)]属性,则反序列化器似乎会在UserInformation内查找LoginName根据要求,}成员不是null

Here您的第二个示例包含User属性

上的属性