从JsonConverter运行默认序列化逻辑
我有一个JsonConverter
,根据实例特定的标志,需要
- 运行自定义序列化逻辑
- 运行默认的Json.NET序列化逻辑
如何从JsonConverter
运行默认的Json.NET序列化逻辑?
谢谢
这是一个例子。 说你的序列化类看起来像这样:
class Foo { public bool IsSpecial { get; set; } public string A { get; set; } public string B { get; set; } public string C { get; set; } }
IsSpecial
标志用于控制我们是否在转换器中执行特殊操作,或者只是自然地进行序列化。 您可以像这样编写转换器:
class FooConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(Foo).IsAssignableFrom(objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Foo foo = (Foo)value; JObject jo; if (foo.IsSpecial) { // special serialization logic based on instance-specific flag jo = new JObject(); jo.Add("names", string.Join(", ", new string[] { foo.A, foo.B, foo.C })); } else { // normal serialization jo = JObject.FromObject(foo); } jo.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } }
然后,要使用转换器,请将其实例传递给SerializeObject
方法(例如,在设置中)。 (不要使用JsonConverter
属性修饰目标类,否则在序列化时会导致无限递归循环。)
class Program { static void Main(string[] args) { List foos = new List { new Foo { A = "Moe", B = "Larry", C = "Curly", IsSpecial = false }, new Foo { A = "Huey", B = "Dewey", C = "Louie", IsSpecial = true }, }; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new FooConverter()); settings.Formatting = Formatting.Indented; string json = JsonConvert.SerializeObject(foos, settings); Console.WriteLine(json); } }
输出:
[ { "IsSpecial": false, "A": "Moe", "B": "Larry", "C": "Curly" }, { "names": "Huey, Dewey, Louie" } ]
您可以更改CanWrite属性以禁用自定义序列化程序。 如果对象可以包含相同类型的子项,或者您要在多个线程中进行序列化,则这将无法正常工作。
class FooConverter : JsonConverter { bool _canWrite = true; public override bool CanWrite { get { return _canWrite;} } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Foo foo = (Foo)value; JObject jo; if (foo.IsSpecial) { // special serialization logic based on instance-specific flag jo = new JObject(); jo.Add("names", string.Join(", ", new string[] { foo.A, foo.B, foo.C })); } else { // normal serialization _canWrite = false; jo = JObject.FromObject(foo); _canWrite = true; } jo.WriteTo(writer); } }