【问题标题】:Json.NET C#: JToken.Parent is always nullJson.NET C#:JToken.Parent 始终为空
【发布时间】: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


    【解决方案1】:

    引用this答案:

    无法访问父对象,因为父对象 总是在他们的孩子之后创造的。那就是你需要阅读 对象包含的json到最后能够完全构造 对象,当您阅读对象的最后一个括号时, 你已经读过它所有的孩子了。当一个孩子解析没有 父母尚未获得参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2020-08-24
      • 2017-08-18
      相关资源
      最近更新 更多