【问题标题】:Ignore a property when deserializing using Json.Net with ItemRequired = Required.Always使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性
【发布时间】:2015-06-22 15:51:12
【问题描述】:

我正在使用 Json.Net 将类序列化和反序列化为 json 并返回。

我向标有[JsonObject(ItemRequired = Required.Always)](或Required.Always)的类添加了一个新的仅获取属性。这导致以下JsonSerializationException

Newtonsoft.Json.JsonSerializationException:在 JSON 中找不到必需的属性 '<PropertyName>'

我认为用JsonIgnore 标记该属性可以解决问题,但这不起作用。

我如何告诉 Json.Net 这个属性应该被忽略?

这是重现问题的最小示例:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [JsonIgnore]
    public string FullName { get { return FirstName + LastName; }}
}

private static void Main()
{
    var hamster = new Hamster {FirstName = "Bar", LastName = "Arnon"};
    var serializeObject = JsonConvert.SerializeObject(hamster);
    var deserializeObject = JsonConvert.DeserializeObject<Hamster>(serializeObject);
}

【问题讨论】:

    标签: c# .net json serialization json.net


    【解决方案1】:

    显然JsonIgnore 在这种情况下只会控制序列化。需要JsonIgnore 来指定FullName 属性不应序列化为json 表示形式。

    要在反序列化期间忽略该属性,我们需要添加带有Required = Required.DefaultJsonProperty 注释(这意味着不需要)。

    所以,这是避免JsonSerializationException的方法:

    [JsonObject(ItemRequired = Required.Always)]
    public class Hamster
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        [JsonIgnore]
        [JsonProperty(Required = Required.Default)]
        public string FullName { get { return FirstName + LastName; }}
    }
    

    【讨论】:

    • 为什么Json.Net(.net core 5)中没有JsonPropertyAttribute?
    • @nAviD 有。刚检查。我假设您实际上并没有使用 Json.NET。
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多