json.net requested property not found in json

pgky5nke  于 2023-06-25  发布在  .NET
关注(0)|答案(3)|浏览(161)

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

你知道我该怎么做吗?

d6kp6zgx

d6kp6zgx1#

您没有在JSON字符串中指定eId,它被设置为必需。你通过了rId ...这是一样的吗?
如果我不明白问题,请让我知道,我会更新我的答案。

UPDATE:表示iSd属性为AllowNull。您仍然需要在JSON字符串中为该属性指定一个值,但它可以为null。根据JSON.NET specs

属性必须以JSON定义,但可以是空值。
您需要为iSd ...指定一个值,或者在JsonProperty属性中将iSd标记为DefaultValue。对于DefaultValuespec表示:
属性不是必需的。默认状态。

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

希望这能帮上忙。

zf2sa74q

zf2sa74q2#

我为Required枚举值及其基于the Required documentation的效果做了一个小表:
| 选择权|必须在场|可以为Null值|
| - -----|- -----|- -----|
| Required.Default||✓|
| Required.AllowNull| ✓| ✓|
| Required.Always| ✓||
| Required.DisallowNull|||
在您的情况下,isD是可选的,您应该使用Required.Default(或Required.DisallowNull)。使用Required.AllowNull也使得isD成为强制性的,因此当它丢失时会抛出Exception。
请注意,在这种情况下,区分“Optional and may be null”(Required.Default)或“Optional but may not null”(Required.DisallowNull)是没有意义的,因为bool是一个不能为null的值类型。如果你想允许空值,你需要使用一个可空值类型(bool?),但是默认值(当该值不存在时)将是null,除非你手动设置它(例如false):

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

lyfkaqu13#

将属性设置为bool,而不是string

相关问题