Могу ли я указать Json.NET десериализовать, но не сериализовать определенные свойства?

У меня есть приложение AngularJS + MVC 5 + Web API 2, которое позволяет пользователям управлять коллекциями объектов в браузере и сразу фиксировать все изменения при нажатии кнопки «Сохранить». По мере внесения изменений к объектам JavaScript добавляется одно или несколько свойств: IsAdded, IsUpdated, IsRemoved. Свойства проверяются на стороне сервера, чтобы определить, что делать при сохранении модели.

Модель обслуживается с использованием Json.NET через веб-API, а базовый класс:

public class CollectionItemViewModel : ICollectionItem
{
    public bool IsAdded { get; set; }
    public bool IsUpdated { get; set; }
    public bool IsRemoved { get; set; }
}

Это прекрасно работает, но добавляет бесполезности моему сериализованному JSON. Я могу не сериализовать эти три свойства с помощью ShouldSerialize, но это также предотвращает их десериализацию.

public bool ShouldSerializeIsAdded()
{
    return false;
}

public bool ShouldSerializeIsUpdated()
{
    return false;
}

public bool ShouldSerializeIsRemoved()
{
    return false;
}

Можно ли десериализовать, но не сериализовать определенные свойства с помощью Json.NET?


person Jared    schedule 14.12.2013    source источник
comment
ShouldSerialize* абсолютно не должен влиять на десериализацию. Вы в этом абсолютно уверены? Потому что это будет большой ошибкой   -  person Marc Gravell    schedule 14.12.2013


Ответы (2)


Вы должны иметь возможность просто использовать методы ShouldSerialize *, как показано в вопросе. Они влияют только на сериализацию, но не на десериализацию.

person Marc Gravell    schedule 14.12.2013
comment
Спасибо за проверку реальности. Клянусь, я проверил это, как описано в моем комментарии к ответу Softlion, но, видимо, недостаточно внимательно. Десериализация работает, как и ожидалось; проблема не была связана с моим приложением. - person Jared; 14.12.2013

Правильный атрибут — JsonIgnore.

[JsonIgnore]
public int Id {get;set;}

Исходный документ доступен здесь:

http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reduction-serialized-json-size

person Softlion    schedule 14.12.2013
comment
Насколько я могу судить, JsonIgnore также предотвращает десериализацию. Я протестировал, используя Fiddler, чтобы захватить образец POST, где IsAdded = true, а затем воспроизвел тот же самый POST как с JsonIgnore, так и без него в моем свойстве IsAdded. Как утверждал Марк, он правильно десериализовался в true, при этом ShouldSerializeIsAdded возвращает false и без JsonIgnore. Добавление JsonIgnore вызвало IsAdded = false. - person Jared; 14.12.2013
comment
@Джаред, действительно, это сделает свойство совершенно неиспользуемым - оно также не будет использоваться во время десериализации. - person Marc Gravell; 14.12.2013