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

时间:2015-03-27 21:31:27

标签: c# json.net

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

我在反序列化期间使用Converter,并且能够检测要实例化的类是.net还是delphi类。

Delphi课程一切正常。 但是,如果需要对.NET类进行实例化,我需要能够创建并填充.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);

完全返回我需要的东西。但这只有在我没有打电话时才有效:

JObject.Load(reader);

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

1 个答案:

答案 0 :(得分:0)

以下作品。花了好几个小时。

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