【问题标题】:Newtonsoft Json How can I have two serialization patterns?Newtonsoft Json 我怎样才能有两种序列化模式?
【发布时间】:2020-11-12 10:47:24
【问题描述】:

我可以使用下面的代码选择一个要序列化的对象,我可以在序列化时忽略没有 [DataMember] 的对象。


namespace MyProject
{
    [DataContract]
    public class MyClass
    {
        public string aaa { get; set; }
        [DataMember] public string bbb { get; set; }
        [DataMember] public string ccc { get; set; }
    }
}
String  str = JsonConvert.SerializeObject((MyClass)jsonClass);

// "{\"bbb\":\"1111\",\"ccc\":\"222\"}"

然后,我想切换两种序列化模式。如下图所示


namespace MyProject
{
    [DataContract]
    public class MyClass
    {
        [DataMember_pattern1] public string aaa { get; set; }
        [DataMember_pattern1, DataMember_pattern2] public string bbb { get; set; }
        [DataMember_pattern2] public string ccc { get; set; }
    }
}

// output I need
// serialized in pattern1
// "{\"aaa\":\"0000\", \"bbb\":\"1111\"}"

// serialized in pattern2
// "{\"bbb\":\"1111\",\"ccc\":\"222\"}"

我也想在反序列化时这样做。 这可能吗?

【问题讨论】:

标签: c# json serialization json.net deserialization


【解决方案1】:

你可以试试继承

public class MyClass
{
     public string bbb { get; set; }

     public virtual string aaa { get; set; }

     public virtual string ccc { get; set; }
}

public class MyClassA : MyClass
{
    [JsonIgnore]
    public override  string ccc { get; set; }
}
public class MyClassC : MyClass
{
    [JsonIgnore]
    public override string aaa { get; set; }

}

var jsonClassA = new MyClassA()
{
    aaa= "0000",
    ccc ="222",
    bbb = "1111"
};
var jsonClassC = new MyClassC()
{
    aaa = "0000",
    ccc = "222",
    bbb = "1111"
};
//{"bbb":"1111","aaa":"0000"}
String strA = JsonConvert.SerializeObject((MyClass)jsonClassA);
//{"bbb":"1111","ccc":"222"}
String strC = JsonConvert.SerializeObject((MyClass)jsonClassC);

【讨论】:

    【解决方案2】:

    创建 2 个实现这两种模式的类:

    namespace MyProject
    {
        public class MyClass
        {
            public string aaa { get; set; }
            public string bbb { get; set; }
            public string ccc { get; set; }
    
            public string SerialisePattern1 => JsonConvert.SerializeObject(new MyClass_Pattern1 { Underlying = this });
            public string SerialisePattern2 => JsonConvert.SerializeObject(new MyClass_Pattern2 { Underlying = this });
        }
    
        public class MyClass_Pattern1
        {
            public string aaa => Underlying.aaa;
            public string ccc => Underlying.ccc;
            [JsonIgnore]
            public MyClass Underlying { get; set; }
        }
    
        public class MyClass_Pattern2
        {
            public string bbb => Underlying.bbb;
            public string ccc => Underlying.ccc;
            [JsonIgnore]
            public MyClass Underlying { get; set; }
        }
    }
    

    或:

    namespace MyProject
    {
        public class MyClass
        {
            public string aaa { get; set; }
            public string bbb { get; set; }
            public string ccc { get; set; }
    
            public string SerialisePattern1 => JsonConvert.SerializeObject(new { aaa, ccc });
            public string SerialisePattern2 => JsonConvert.SerializeObject(new { bbb, ccc });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多