json.net需要在json中找不到的属性

时间:2011-09-19 14:26:15

标签: c# json json.net

我正在使用Json.net,我有一个类如下

public class RecordAlias
    {   
        [JsonProperty(PropertyName = "eId", Required = Required.Always)]
        public string EntityId { get; set; }

        [JsonProperty(PropertyName = "aId", Required = Required.AllowNull)]
        public string AliasId { get; set; }

        [JsonProperty(PropertyName = "iSd", Required = Required.AllowNull)]
        public bool IsSelected { get; set; }
    }

因此,即使某些项目在json字符串中没有属性“iSd”,也可以对json进行反序列化,我希望如果不存在,则应该填充该类型的默认值,例如,IsSelected应该为false,除非最后一项

      [{
        "eId" : "30022004",
        "aId" : "1"
    }, {
        "eId" : "30021841",
        "aId" : "1"
    }, {
        "eId" : "30021848",
        "aId" : "1"
        "iSd" : true
    }
]

我知道如何实现这一目标?

3 个答案:

答案 0 :(得分:10)

您没有在JSON字符串中指定eId,并且将其设置为必需。你正在通过rId ......这是一回事吗?

如果我不理解这个问题,请告诉我,我会更新我的答案。

<强>更新: 您指出iSd属性为AllowNull。您仍然必须在JSON字符串中为此属性指定值,但它可以为null。根据JSON.NET specs

  

该属性必须以JSON定义,但可以为空值。

您需要在iSd属性中指定iSd ...或标记JsonPropertyDefaultValue。对于DefaultValuespec说:

  

该物业不是必需的。默认状态。

[JsonProperty(PropertyName = "iSd", Required = Required.Default)]
public bool IsSelected { get; set; }

我希望这会有所帮助。

答案 1 :(得分:1)

将属性设为bool而不是string

答案 2 :(得分:0)

我根据the Required documentationRequired枚举值及其效果制作了一个小表:

                       | Must be present | Can be Null value
-----------------------+-----------------+------------------
Required.Default       |                 |         ✓    
-----------------------+-----------------+------------------
Required.AllowNull     |        ✓        |         ✓    
-----------------------+-----------------+------------------
Required.Always        |        ✓        |            
-----------------------+-----------------+------------------
Required.DisallowNull  |                 |          

在您的情况下,isD是可选的,您应该使用Required.Default(或Required.DisallowNull)。使用Required.AllowNull也会使isD成为强制性的,因此在它丢失时会抛出异常。

请注意,在这种情况下,区分&#34; Optional并且可能为null&#34;是没有意义的。 (Required.Default)或&#34;可选但不得为空&#34; (Required.DisallowNull)因为bool是一个不能为null的值类型。如果要允许空值,则需要使用可空值类型(bool?),但是默认值(当值不存在时)将为null,除非您手动设置它(例如false):

[JsonProperty(PropertyName = "iSd", Required = Required.Default)]
public bool? IsSelected { get; set; } = false;