【问题标题】:JSON.Net deserialization populate missing propertiesJSON.Net 反序列化填充缺失的属性
【发布时间】:2016-02-29 05:47:15
【问题描述】:

我想将一个 json 对象反序列化为一个 c# 类,并拥有一个完全填充的默认对象,即使我的 JSON 缺少信息。我试过了

  • 带有 [DefaultValue] 的注释
  • 为类创建构造函数
  • 使用设置对象反序列化

设置对象:

new JsonSerializerSettings {
    DefaultValueHandling = DefaultValueHandling.Populate
    NulValueHandling = NullValueHandling.Include
    ObjectCreationHandling = ObjectCreationHandling.Replace
}

考虑这些 c# 类

public class Root{
    public SpecialProperty name {get;set;}
    public SpecialProperty surname {get;set;}
}

public class SpecialProperty {
    string type {get;set;}
    string value {get;set;}
}

考虑一下这个 JSON

"Root" : {
    "name" : { 
        "type" : "string",
        "value": "MyFirstname"
    }
}

如何将此 json 反序列化为一个对象,并将可用数据序列化为一个新对象和缺少的属性,在这种情况下,设置为 string.empty

【问题讨论】:

    标签: c# json json.net deserialization


    【解决方案1】:

    最简单的解决方法是将您想要的默认值放在构造函数中。

    public class Root
    {
        public SpecialProperty Name { get; set; }
        public SpecialProperty Surname { get; set; }
    
        public Root()
        {
            this.Name = SpecialProperty.GetEmptyInstance();
            this.Surname = SpecialProperty.GetEmptyInstance();
        }
    }
    
    public class SpecialProperty
    {
        public string Name { get; set; }
        public string Type { get; set; }
    
        public static SpecialProperty GetEmptyInstance()
        {
             return new SpecialProperty
             {
                  Name = string.Empty,
                  Type = string.Empty
             };
        }
    }
    

    【讨论】:

    • 谢谢,我就是这么做的。创建构造函数并在各处初始化它们。虽然我仍然认为它应该能够通过注释和JsonSerializerSettings 对象来初始化整个事物,但也许Serializer 这个词在这个故事中是最重要的,因为我正在尝试反序列化。如果有人发现一个纯 JsonNet 解决方案而无需通过创建和更新对象的类,我想知道。
    【解决方案2】:

    一种解决方案可能是反序列化为对象 X,将默认值存储到对象 Y 中,然后使用 AutoMapper 之类的东西将非空值从 X 映射到 Y。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多