【发布时间】:2019-01-30 21:55:33
【问题描述】:
我正在开发一个严重依赖自定义转换器、合同解析器和属性的 Json.NET 序列化系统。该系统旨在处理引用反序列化,包括不区分顺序的相互引用和解析。我没有为此使用 Json.NET 的本机系统,因为我们有特殊要求。
我当前的系统在反序列化对象时识别引用请求。此引用采用数字 ID 或人类可读字符串的形式。如果引用的请求对象已经被反序列化,那么需要引用的对象只需从大字典中分配其正确值即可。如果不是,则提交“参考请求”。此请求包含一个对象和一个 ID。
当我写这个系统时,我没有意识到改变引用请求中的对象并不会自动改变它的接收者。因此,它根本不起作用。
但是,解决这个问题应该很简单。如果我得到一个对象的封装字段所有者(例如,如果在 Dinner 中定义了 Wine,我需要在反序列化期间检查 Wine 时检索 Dinner),我可以简单地使用反射来设置字段。我本质上是在存储字段地址。从我收集到的信息来看,这应该完全可以通过JToken.Parent 遍历 Json 层次结构来实现。但是,当我尝试在应该有父对象的对象中访问此字段时,它为空。我搜索了又搜索,但没有发现Parent 是我需要自己设置的东西;我认为它是由 Json.NET 在内部处理的。为什么这个是空的?
下面是一个例子。 FoodExample 包含一个 Food 字段,它本身定义了一个 Wine 字段。
public class FoodExample
{
// This meal contains a defined instance of Wine, instead of a reference.
public Food definedMeal = null;
public FoodExample()
{
}
public void Initialise()
{
Food definedMeal = new Food("Steak", new Wine("Pinot Noir", 15.99f));
}
}
当使用我的自定义转换器反序列化 Wine 时,我查询 Wine 的 JToken.Parent 字段,如下所示:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Debug.Log("Deserialising definition: " + objectType);
// Create a JObject. Use it to get a JReader,
JObject jObject = JObject.Load(reader);
JsonReader jsonReader = jObject.CreateReader();
Debug.Log("Parent: " + (jObject.Parent == null)); // Prints true
}
Json 输出:
{
"definedMeal": {
"ID": 1,
"name": "Steak",
"pairsWellWith": {
"ID": 0,
"price": 15.99,
"name": "Pinot Noir"
}
}
}
通过我的自定义转换器时,此层次结构中两个对象的父对象都显示为 null。
值得一提的是,我正在使用 Unity3D。
【问题讨论】:
标签: c# unity3d null json.net parent