c#Json.NET ToJson()FromJson()

kof*_*fus 6 c# json.net

我理解创建外部 JsonConverter 类的价值,但是在很多情况下我发现它不必要地繁琐。

有没有一种通用的方法来告诉 JSon.NET,如果一个类有一个string ToJson()用于序列化的方法,如果该类有一个void FromJson(string json)用于反序列化的方法?

或者/还有对于不可变类型,如果一个类有static T FromJson(string json)用途?

kof*_*fus 4

我们需要一个特殊的转换器:

namespace Newtonsoft.Json {
  class JsonManualConverter : JsonConverter {
    public override bool CanConvert(Type t) => t.GetMethod("ToJson") != null && t.GetMethod("FromJson") != null;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
      objectType.GetMethod("FromJson").Invoke(new object(), new object[] { JRaw.Create(reader).ToString() });

    public override void WriteJson(JsonWriter writer, object o, JsonSerializer serializer) =>
      writer.WriteRawValue(o.GetType().GetMethod("ToJson").Invoke(o, new object[] { }) as string);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以简单地这样做:

  [JsonConverter(typeof(JsonManualConverter))]
  class MyClass {
    public string ToJson() => // serialize and return json string
    static public MyClass FromJson(string json) => // deserialize and return a MyClass instance
    ...
  }
Run Code Online (Sandbox Code Playgroud)

并且 Json.Net 将使用这些方法