NewtonsoftJson我怎么能有两个序列化模式



我可以选择一个对象用下面的代码进行序列化,并且在序列化时可以忽略没有[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"}"

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

您可以尝试使用继承

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);

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

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 });
}
}

最新更新