使用带有ItemRequired = Required.Always的Json.Net进行反序列化时忽略属性

时间:2015-06-22 15:51:12

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

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

我添加了一个标有[JsonObject(ItemRequired = Required.Always)](或Required.Always)的新类,这是一个新的get-only属性。这导致以下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);
}

1 个答案:

答案 0 :(得分:24)

显然JsonIgnore只会控制此情况下的序列化。需要JsonIgnore来指定不应将FullName属性序列化为json表示。

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

所以,这是如何避免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; }}
}