【发布时间】:2020-06-26 08:22:25
【问题描述】:
我想在每次对特定类进行反序列化时运行一些代码。 (我无法访问//修改类以添加[OnDeserialized] 属性)
我的第一种方法是使用自定义 jsonconverter 并在 readjson 中运行一些代码。 问题是,自定义类可能很复杂,并且反序列化所有子属性听起来太多(当所有子属性都在没有转换器的情况下正确反序列化时)。
有没有办法在反序列化类型时添加自定义代码? 或者如何使用 jsonconverter readjson 来创建和递归填充其内容(就像反序列化器在没有转换器的情况下所做的那样)?
还有一件事,类型是派生的,所以我不能使用 Jsonconverter.CanConvert 方法。 (因为它在基本类型上触发)
这只是我在readjson中使用的一些想法
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Load the JSON for the Result into a JObject
JObject jObject = JObject.Load(reader);
// Read the properties which will be used as constructor parameters
//var enemy = Activator.CreateInstance(null, jObject["$type"]);
object t = jObject["$type"];
string[] split = t.ToString().Split(',');
string ass = split[1].Trim();
string typ = split[0];
var allassemblies = AppDomain.CurrentDomain.GetAssemblies();
Assembly a = null;
foreach (Assembly assembly in allassemblies)
{
if (assembly.FullName.StartsWith(ass))
{
a = assembly;
break;
}
}
Type tt = a.GetType(typ);
var instance = Activator.CreateInstance(tt);
//DO I REALLY NEED TO RECURSIVELY WORK THROUGH THE CONTENT (how to populate the instance?)
//SOME CUSTOM CODE dependant on the deserialized type
//before returning change working dir to the auc addons settings directory
AddonUserControl auc = instance as AddonUserControl;
dm_addon dma = AddonManager.FindAddonDataByAUCAssembly(auc);
SystemExtensions.SetRelativeWorkingDirectory("settings//" + dma.Path);
return instance;
}
请注意,我无法修改被反序列化的类型。
【问题讨论】:
-
你能修改有问题的类型吗?如果是这样,您可以向其添加
[OnDeserialized]回调,请参见例如Deserializing such that a field is an empty list rather than null. -
见:Json.NET serialization pre and post calls。事实上,我认为这是重复的,同意吗?
-
顺便说一句,您的代码容易受到“Friday the 13th JSON Attacks”类型的注入攻击,详情请参阅TypeNameHandling caution in Newtonsoft Json。
-
是的,
[OnDeserialized]可以与TypeNameHandling一起正常工作,请参阅dotnetfiddle.net/oLr3gh。作为副本关闭。此外,您可以使用serializer.Populate()来填充您的对象,请参阅How can I populate an existing object from a JToken (using Newtonsoft.Json)?。 -
谢谢!等等 :) 我无法修改类型。
标签: types json.net deserialization