【问题标题】:NewtonSoft.json base class serializationNewtonSoft.json 基类序列化
【发布时间】:2015-02-17 12:01:57
【问题描述】:

当我将相关的 Newtonsoft.json.dll 从 .NET 3.5 更新到 .NET 4.5 时,基类没有序列化。在更新之前,基类正在序列化。

public class MyBaseClass
{
    public string BaseProp1 { get; set; }
    public string BaseProp2 { get; set; }
}

[DataContract]
public class MyDerivedClass : MyBaseClass
{
    [DataMember]
    public DateTime DerProp1 { get; set; }
    public string DerProp2 { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        MyDerivedClass derc = new MyDerivedClass();
        derc.BaseProp1 = "BaseProp1";
        derc.DerProp1 = DateTime.Now;
        derc.BaseProp2 = "BaseProp2";
        derc.DerProp2 = "DerProp2";

        Newtonsoft.Json.Converters.IsoDateTimeConverter conv = new Newtonsoft.Json.Converters.IsoDateTimeConverter();
        conv.DateTimeFormat = "MM/dd/yyyy HH:mm:ss zzz";

        string jsonSerializedObject = JsonConvert.SerializeObject(derc, conv);

    }
}

程序不序列化基类的成员。原因是我没有在基类中指定 [DataContract]。我需要对所有成员进行序列化。 问题:

  1. 我无法从派生类中删除 [DataContract],因为它被 WCF 广泛使用。
  2. 我不想将 [DataContract] 添加到基类,因为有很多成员。

最好的方法是什么?

【问题讨论】:

    标签: c# .net json wpf


    【解决方案1】:

    默认情况下忽略基类属性。您可以通过创建自定义合同解析器来更改此行为。

    class MyContractResolver : DefaultContractResolver
    {
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            var list = base.CreateProperties(type, memberSerialization);
    
            foreach (var prop in list)
            {
                prop.Ignored = false; // Don't ignore any property
            }
    
            return list;
        }
    }
    

    此解析器将有效地确保不会忽略任何属性。如果您确实希望忽略某些属性,则可能需要应用一些逻辑。

    使用解析器;创建一个JsonSerializerSettings 实例并将其提供给JsonConvert.SerializeObject 方法。

    您的最后一行将被替换为:

    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        ContractResolver = new MyContractResolver(),
        Converters = { conv },
    };
    
    string jsonSerializedObject = JsonConvert.SerializeObject(derc, settings);
    

    然后将序列化基类属性:

    {
    "DerProp1":"02-17-2015 13:39:29 +01:00",
    "DerProp2":"DerProp2",
    "BaseProp1":"BaseProp1",
    "BaseProp2":"BaseProp2"
    }
    

    【讨论】:

      【解决方案2】:

      使用 JsonProperty

         public class MyBaseClass
         {
            [JsonProperty("BaseProp1")]
            public string BaseProp1 { get; set; }
            [JsonProperty("BaseProp2")]
            public string BaseProp2 { get; set; }
         }
      
         [DataContract]
         public class MyDerivedClass : MyBaseClass
         {
            [JsonProperty("DerProp1")]
            [DataMember]
            public DateTime DerProp1 { get; set; }
            [JsonProperty("DerProp2")]
            public string DerProp2 { get; set; }
         }
      

      【讨论】:

      • 我怀疑 OP 也不想使用 [JsonProperty] 属性。引用:“我不想将 [DataContract] 添加到基类,因为有很多成员”
      猜你喜欢
      • 2020-06-07
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2022-01-02
      相关资源
      最近更新 更多