Мога ли да инструктирам Json.NET да десериализира, но не и да сериализира специфични свойства?

Имам приложение AngularJS + MVC 5 + Web API 2, което позволява на потребителите да управляват колекции от обекти в браузъра и да извършват всички промени наведнъж, когато се щракне върху бутон Запазване. Когато се правят промени, едно или повече свойства се добавят към JavaScript обектите: IsAdded, IsUpdated, IsRemoved. Свойствата се проверяват от страна на сървъра, за да се определи какво да се прави при запазване на модела.

Моделът се сервира с помощта на Json.NET чрез Web 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-reducing-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
@Jared наистина, това ще направи свойството напълно неизползвано - то няма да се използва и по време на десериализация. - person Marc Gravell; 14.12.2013