C# JSON.NET转换器:如果缺少给定值,请使用默认反序列化
我有一个Delphi和.NET都知道的COM接口。 NET和Delphi类都实现了这个接口 我在反序列化期间使用转换器,能够检测要实例化的类是.net还是delphi类 对于Delphi类来说,一切都很好。 但是,如果需要安装.NET类,我需要能够创建和填充.NET对象 请参阅下面的代码片段C# JSON.NET转换器:如果缺少给定值,请使用默认反序列化,c#,json.net,C#,Json.net,我有一个Delphi和.NET都知道的COM接口。 NET和Delphi类都实现了这个接口 我在反序列化期间使用转换器,能够检测要实例化的类是.net还是delphi类 对于Delphi类来说,一切都很好。 但是,如果需要安装.NET类,我需要能够创建和填充.NET对象 请参阅下面的代码片段 class DelphiTypesJsonConverter : Newtonsoft.Json.JsonConverter { private const string XMLKEY =
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.Loadreader来确定是处理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());
}
如果只使用var xmlBlob=jToken[XMLKEY],会怎么样?这样,您就不需要从新的读者那里加载JObject了。@Brian,谢谢!你赢了我,这就成功了!!我只是在深入挖掘JToken…没问题;很高兴我能帮忙。