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

Min*_*ing 9 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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

      [{
        "eId" : "30022004",
        "aId" : "1"
    }, {
        "eId" : "30021841",
        "aId" : "1"
    }, {
        "eId" : "30021848",
        "aId" : "1"
        "iSd" : true
    }
]
Run Code Online (Sandbox Code Playgroud)

知道我怎么能实现这个目标?

Dav*_*ter 11

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

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

更新:您正在指示该iSd属性AllowNull.您仍然必须在JSON字符串中为此属性指定值,但它可以为null.根据JSON.NET 规范:

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

你需要指定一个值iSd...或标记iSd在你的JsonProperty属性为DefaultValue.因为DefaultValue,规范说:

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

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

我希望这有帮助.


MSe*_*ert 7

我做了一个小桌子Required基于枚举值及其效果Required文档

                       | Must be present | Can be Null value
-----------------------+-----------------+------------------
Required.Default       |                 |         ?    
-----------------------+-----------------+------------------
Required.AllowNull     |        ?        |         ?    
-----------------------+-----------------+------------------
Required.Always        |        ?        |            
-----------------------+-----------------+------------------
Required.DisallowNull  |                 |          
Run Code Online (Sandbox Code Playgroud)

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

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

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