簡體   English   中英

Json.NET C#:JToken.Parent始終為null

[英]Json.NET C#: JToken.Parent is always null

我正在開發一個Json.NET序列化系統,它嚴重依賴於自定義轉換器,契約解析器和屬性。 該系統旨在處理參考反序列化,包括對訂單不敏感的相互引用和解析。 我沒有使用Json.NET的本機系統,因為我們有特殊要求。

我的當前系統在對象被反序列化時標識對引用的請求。 此引用采用數字ID或人為可讀字符串的形式。 如果引用的請求對象已經被反序列化,則只需從大字典中為需要引用的對象分配其正確的值。 如果不是,則提交“參考請求”。 此請求包含一個對象和一個ID。

當我編寫這個系統時,我沒有意識到更改引用請求中的對象不會自動更改其收件人。 因此,它根本不起作用。

但是,解決這個問題應該非常簡單。 如果我得到一個對象的封裝字段所有者(例如,如果Wine在Dinner中定義,我需要在反序列化期間檢查Wine時檢索Dinner),我可以簡單地使用反射來設置字段。 我基本上存儲了字段地址。 從我收集的內容JToken.Parent通過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工作。

引用這個答案:

無法訪問父級,因為父級對象始終在其子級之后創建。 那就是你需要讀取對象所包含的json,以便能夠完全構造對象,當你讀取對象的最后一個括號時,你已經讀過它的所有子節點。 當孩子解析時,沒有父母可以獲得參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM