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());
}
我有一个 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());
}