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