2015-06-22 4 views
12

Я использую Json.Net для сериализации и десериализации классов для json и back.Игнорировать свойство при десериализации с помощью Json.Net с ItemRequired = Required.Always

Я добавил к классу, помеченному [JsonObject(ItemRequired = Required.Always)] (или Required.Always) новым свойством get-only. Это приводит к следующему 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); 
} 

ответ

19

Очевидно 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; }} 
} 
Смежные вопросы