我正在开发一个Json.NET序列化系统,该系统严重依赖于自定义转换器,协定解析器和属性。该系统旨在处理参考反序列化,包括对顺序不敏感的相互参考和解析。我没有为此使用Json.NET的本机系统,因为我们有特殊要求。
我的当前系统在反序列化对象时识别对引用的请求。此引用采用数字ID或人类可读字符串的形式。如果引用的请求对象已经反序列化,则只需从大型词典中为需要引用的对象分配正确的值即可。如果不是,则提交“参考请求”。该请求包含一个对象和一个ID。
当我编写此系统时,我没有意识到更改引用请求中的对象不会自动更改其接收者。因此,它根本不起作用。
但是,解决这个问题应该很简单。如果得到对象的封装字段所有者(例如,如果Wine是在Dinner中定义的,则在反序列化期间检查Wine时需要检索Dinner),则可以简单地使用反射来设置字段。我本质上是在存储字段地址。从我收集到的信息来看,通过JToken.Parent
遍历Json层次结构应该完全有可能。但是,当我尝试在应该具有父对象的对象中访问此字段时,它为null。我进行了搜索,但是没有发现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中工作。
答案 0 :(得分:0)
引用this答案:
无法访问父对象,因为父对象 总是在孩子之后创造的。那是你需要阅读 对象组成的json才能完全构造 该对象,并且等到您阅读完该对象的最后一个括号后, 您已经阅读了所有的孩子。当孩子被解析时,没有 父母尚未获得参考。