【问题标题】:C# DataContractJsonSerializer ReadObject not throwing error if member is missing如果缺少成员,C# DataContractJsonSerializer ReadObject 不会抛出错误
【发布时间】:2017-08-07 12:57:28
【问题描述】:

我有一个类似的用户类

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 和 class 是一个例子,有很多成员供我单独检查! 我想确保,JSON 包含该类的所有成员,如果没有,则抛出错误。

但我似乎找不到路。我在这里错过了什么?

【问题讨论】:

  • if (String.IsNullOrEmpty(objApp.Application))
  • @Milney : JSON 和 class 是一个例子,有很多成员供我单独检查!
  • 致“反对者”。而不是投反对票,请注意解释/评论为什么投反对票?我可以做些什么来更好地解释问题以寻求帮助?

标签: c# json serialization datacontractjsonserializer


【解决方案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; }

【讨论】:

  • Newtonsoft 现在几乎是默认的 json 序列化器。甚至微软内部也使用它。你最好切换到这个并忘记曾经存在的 DataContractJsonSerializer
  • ^ 这个。没有理由更喜欢 DataContract 之一,但我把它放在那里以防万一我知道有些项目可能有奇怪的约束@S
  • 如果要将[DataMember]应用于成员,还需要将[DataContract]应用于类型本身,这使得序列化选择加入而不是退出。
  • ^ 确实,很抱歉忘记了这一点,因为我不经常使用它
  • @Milney 感谢您的意见和详细解释。我现在远离我的工作机器。明天会检查并更新您。
猜你喜欢
  • 2023-03-29
  • 2020-08-22
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 2018-01-27
  • 2021-12-21
相关资源
最近更新 更多