C # DataContractJsonSerializer ReadObject не выдает ошибку, если член отсутствует

У меня есть класс пользователя вроде

public class User
{
  public string UserName {get;set;}
  public string Application {get;set;}
}

Теперь я использую это как

var jsonSerializer = new DataContractJsonSerializer(typeof(User));
var objApp = (User)jsonSerializer.ReadObject(new MemoryStream(Encoding.Unicode.GetBytes(JsonInput)));

Но мой JSON JsonInput не содержит обоих значений, например, приложение недоступно в JSON. Это по-прежнему сериализуется только с UserName. Приведенный выше JSON и класс являются примером, у меня есть несколько участников, чтобы проверить их по отдельности! Я хочу убедиться, что JSON содержит всех членов класса, в противном случае выдается ошибка.

Но я не могу найти способ. Что мне здесь не хватает?


person Milind Thakkar    schedule 07.08.2017    source источник
comment
если (String.IsNullOrEmpty (objApp.Application))   -  person Milney    schedule 07.08.2017
comment
@Milney: JSON и класс являются примером, у меня довольно много членов, чтобы я мог проверить их по отдельности!   -  person Milind Thakkar    schedule 07.08.2017
comment
Голосующему против. Вместо того, чтобы голосовать против, пожалуйста, объясните / прокомментируйте, почему голосование против? Что я мог сделать лучше, чтобы объяснить проблему, чтобы обратиться за помощью?   -  person Milind Thakkar    schedule 07.08.2017


Ответы (1)


Если вы используете Newtonsoft (который можно установить с помощью Install-Package Newtonsoft.Json) - вы можете установить свойство MissingMemberHandling в настройках;

    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.MissingMemberHandling = MissingMemberHandling.Error;

Тогда передайте это;

    var userObj = JsonConvert.DeserializeObject<User>(jsonInput, settings);

Если вместо этого вы должны использовать Datacontract, вы можете украсить свой объект User обязательными атрибутами;

 [DataMember(IsRequired=true)]
 public string? RequiredProperty { get; set; }
person Milney    schedule 08.08.2017
comment
Newtonsoft теперь в значительной степени является сериализатором json по умолчанию. Даже Microsoft использует его для внутренних целей. Вам гораздо лучше переключиться на это и забыть, что DataContractJsonSerializer когда-либо существовал - person Liam; 08.08.2017
comment
^ Это. Нет причин предпочитать DataContract, но я положил его туда на всякий случай, так как знаю, что в некоторых проектах могут быть странные ограничения @S - person Milney; 08.08.2017
comment
Если вы хотите применить [DataMember] к членам, также необходимо применить [DataContract] к самому типу, что дает согласие на сериализацию, а не на отказ. - person dbc; 08.08.2017
comment
^ В самом деле, извините, забыл об этом, так как я не очень им пользуюсь - person Milney; 08.08.2017
comment
@Milney Спасибо за оба момента и подробное объяснение. Я сейчас вдали от своей рабочей машины. Завтра проверю и сообщу вам. - person Milind Thakkar; 09.08.2017