JSON.NET 转换器:如果缺少给定值,请使用默认反序列化

JSON.NET Converter: If a given value is missing use default deserialization

我有一个 Delphi 和 .NET 都知道的 COM 接口。 .NET 和 Delphi class 都实现了这个接口。

我在反序列化过程中使用转换器,并且能够检测要实例化的 class 是 .net 还是 delphi class.

Delphiclass 一切正常。 但是,如果需要实例化 .NET class,我需要能够创建和填充 .NET 对象。

参考下面的代码片段。

  class DelphiTypesJsonConverter : Newtonsoft.Json.JsonConverter
  {
    private const string XMLKEY = "__XML";

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
      var jObject = JObject.Load(reader);
      var xmlBlob = jObject.GetValue(XMLKEY);
      if (xmlBlob != null)
      {
        var delphiObject = CreateDelphiCOMObject(xmlBlob);// Object will be created in Delphi. This works!
        return delphiObject;
      }

      // The implementing class is a .NET class
      // Just proceed with the default behaviour based on the $type identifier.
      // How can I now create the type that would have been created if this converter would have not been executed.

      return ????;   
    }
  }

编辑

同时我发现调用

return serializer.Deserialize(reader);

returns 正是我所需要的。但这只有在我没有打电话的情况下才有效:

JObject.Load(reader);

之前。 但我需要调用 JObject.Load(reader) 才能确定处理的是 Delphi 还是 .NET 对象。 越来越近了...

以下作品。在这上面花了几个小时。

   public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
      var jToken = JToken.Load(reader);
      if (jToken.HasValues)
      {
        var xmlBlob = jToken[XMLKEY];
        if (jToken.First.Path == XMLKEY)
        { 
          var delphiObject = CoreFactory.CrossPlatformProperties.DeserializeDelphiObject(xmlBlob.Value<string>());
          return delphiObject;
        }
      }
      return serializer.Deserialize(jToken.CreateReader());
    }