0

Когда у меня есть следующие модели:Только Игнорировать аннулирует на десериализации в Json.NET

public class Customer 
{ 
    public Customer 
    { 
     FirstName = string.Empty; 
     LastName = string.Empty; 
    } 

    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 
    public string FirstName {get;set;} 

    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 
    public string LastName {get;set;} 
} 

И что отлично работает, когда я отправляю данные:

// { 
// firstName: null, 
// lastName: null 
// } 

public int Post([FromBody]Customer customer) 
{ 
    var firstName = customer.FirstName; // <-- value is "" 
} 

Проблема с этим что если разработчик забывает в этой системе, чтобы инициализировать данные, то структура ответ будет оставить его:

public Customer 
{ 
    FirstName = ""; 
} 

// { 
// firstName: '' 
// } 

Ba я не хочу, чтобы значения были нулевыми, но я также не хочу требовать от пользователя добавления необязательного параметра в запрос. Я не могу использовать [Require], потому что он не удовлетворяет этой второй части.

Как это установлено, теперь на разработчика есть инициатор для инициализации свойства, иначе он будет опущен. Есть ли способ сделать это, чтобы он игнорировал только десериализацию, а не сериализацию?

+0

Что произойдет, если вы используете 'Include' вместо этого? Документация заявляет, что она исключает ее при десериализации, если она равна нулю, и используется «Игнорировать»: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm –

+0

Класс 'Customer' не компилируется. Могу ли я предположить, что внутренний 'public Customer {}' является безпараметрическим конструктором? – dbc

+0

Да, извините, набрал его вручную –

ответ

0

Если я мог бы перефразировать ваш вопрос, вы, кажется, спрашивать, Как я могу иметь свойство типа, который всегда имеет по умолчанию, ненулевое значение, даже если задано значение null при десериализации JSON или когда UNINITIALIZED в приложении код? Если это перефразировка правильно, это может быть обработано самого типа с использованием явного, а не автоматическими свойствами:

public class Customer 
{ 
    string firstName = ""; 
    string lastName = ""; 

    public Customer() { } 

    public string FirstName { get { return firstName; } set { firstName = value ?? ""; } } 

    public string LastName { get { return lastName; } set { lastName = value ?? ""; } } 
} 

FirstName и LastName теперь гарантировано не будет ненулевым независимо от того, как строится Customer класс.

+0

Благодарим вас за ответ, но это решение по-прежнему ставит ответственность разработчика за проверку нулевого значения с помощью оператора null coalesce. Я думал больше. Если бы я смог игнорировать свойство null при десериализации, но на обратном пути к клиенту объект должен выглядеть полным, так как во всех свойствах сериализуется, даже если они равны нулю, поэтому json выглядит как полный объект. –

+0

@TomFobear - пожалуйста, уточните ваши требования. 1) Что вы хотите увидеть в возвращаемом JSON для вашего класса - «null» или '' ''? 2) Какой уровень нагрузки для ваших разработчиков является приемлемым? Как заставить разработчика добавить '[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]' для каждого свойства более или менее обременительно, чем заставить их добавлять '??' в каждое свойство? – dbc

+0

Я полагаю, что это не так, и он удовлетворяет требованию сериализации этого свойства json. Есть ли атрибут, который я могу наследовать, который будет вызываться десериализатором? –

Смежные вопросы