Json.NET C#:JToken.Parent始终为null

时间:2018-08-24 12:03:59

标签: c# unity3d null json.net parent

我正在开发一个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中工作。

1 个答案:

答案 0 :(得分:0)

引用this答案:

  

无法访问父对象,因为父对象   总是在孩子之后创造的。那是你需要阅读   对象组成的json才能完全构造   该对象,并且等到您阅读完该对象的最后一个括号后,   您已经阅读了所有的孩子。当孩子被解析时,没有   父母尚未获得参考。