【问题标题】:json.net required property not found in json在 json 中找不到 json.net 所需的属性
【发布时间】:2011-09-19 14:26:15
【问题描述】:

我正在使用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
    }
]

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

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    您没有在 JSON 字符串中指定 eId,它被设置为必需。你正在传递rId...这是同一件事吗?

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

    更新: 您表示iSd 属性是AllowNull。您仍然必须在 JSON 字符串中为此属性指定一个值,但它可以为 null。根据 JSON.NET specs:

    该属性必须在 JSON 中定义,但可以是空值。

    您需要为iSd...指定一个值,或在JsonProperty 属性中将iSd 标记为DefaultValue。对于DefaultValuespec 表示:

    该属性不是必需的。默认状态。

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

    我希望这会有所帮助。

    【讨论】:

    • 对不起,我在复制粘贴时犯了一个错误。我已经更新了我的问题
    • 一些 json 字符串没有该属性,因为该属性是可选的。如何使类接受没有特定属性值的 json 字符串?
    • 看我的答案——将JsonProperty属性的Required属性设置为Default
    【解决方案2】:

    我根据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 成为强制性的,因此它会在丢失时抛出异常。

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

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

    【讨论】:

      【解决方案3】:

      将属性设为bool 而不是string

      【讨论】:

      • 对不起,我在复制我的课程时出错了,我已经更新了我的问题
      猜你喜欢
      • 2017-01-29
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多