web-dev-qa-db-ja.com

ItemRequired = Required.AlwaysでJson.Netを使用してデシリアライズするときにプロパティを無視します

私はJson.Netを使用して、クラスをjsonにシリアライズおよびデシリアライズします。

[JsonObject(ItemRequired = Required.Always)](またはRequired.Always)新しい取得専用プロパティ。次のJsonSerializationExceptionになります。

Newtonsoft.Json.JsonSerializationException:必須プロパティ'<PropertyName>' JSONに見つかりません

そのプロパティを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);
}
17
i3arnon

この場合、明らかに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; }}
}
26
i3arnon