2016-07-27 13 views
0

我認爲這個問題可能不合格,所以我創建了一個「姐妹」的問題,這個問題更接近現實,引用了哪些具體輸出。請看: Querying JSON Nested Arrays with Linq, JSON.NET, C# 如果這個問題在此之前得到了答案,我會嘗試使用其他問題的信息自己回答這個問題...... :)謝謝!從分層JSON第II部分中挑選出簡單屬性

在上一個問題(Picking Out Simple Properties from Hierarchical JSON)中,我問如何從分層JSON中獲取簡單的屬性。那裏的答案[在本文結尾處作爲Linq查詢粘貼]非常有用(自發布以來,我已經研究了很多關於Linq和JSON.NET的內容)。所以我沒有使用這個論壇,因爲我很懶 - 當我被困住時,我使用它,似乎無法在我可以訪問的書中找到答案。

我對如何繼續上一個問題提供的示例感到沮喪。這個問題建立在前一個問題的基礎上,所以在這裏(如我所能表達的那樣簡潔)是我想要學習如何在單個Linq查詢中完成的。

總結一下:我與動態JSON像這樣的(它比我以前的部分提出我質疑JSON更爲複雜,因爲它包含數組)工作:

{ 
    "Branch1": { 
     "Prop1A": "1A", 
     "Prop1B": "1B", 
     "Prop1C": "1C", 
     "Branch2": { 
      "Prop2A": "2A", 
      "Prop2B": "2B", 
      "Prop2C": "2C", 
      "Branch3": [{ 
       "Prop3A": "3A", 
       "Prop3B": "3B", 
       "Prop3C": "3C" 
      }, { 
       "Prop3D": "3D", 
       "Prop3E": "3E", 
       "Prop3F": "3F" 
      }, { 
       "Prop3G": "3G", 
       "Prop3H": "3H", 
       "Prop3I": "3I" 
      }] 
     }, 
     "Branch4": [{ 
      "Prop4A": "4A", 
      "Prop4B": "4B", 
      "Prop4C": "4C" 
     }, { 
      "Prop4E": "4E", 
      "Prop4F": "4F", 
      "Prop4G": "4G" 
     }, { 
      "Prop4H": "4H", 
      "Prop4I": "4I", 
      "Prop4I": "4I" 
     }] 
    } 
} 

正如你所看到的,動態JSON由分層對象組成,這些對象是JSON對象,JSON數組和JSON屬性。

最終,我想將此JSON轉換爲我可以在C#中使用的List對象。我打算使用該List對象從頂部向下以文檔順序有效地處理每個JSON分支。

列表集合中的每個項目都是JObject;這些對象中的每一個都會有一個合成的「父」字符串屬性,該屬性將指向該JObject出現在原始JSON下的分支(我的示例下面解釋我的意思是「父」)。 [前面的問題正確地提出了這個「父」值的解決方案,所以這與這個問題不太相關......這裏有什麼新/相關的是處理JSON中的JArray對象...]

關鍵是我希望每個List項目對象只包含對象的字符串值屬性。例如,Branch1具有字符串屬性Prop1A,1B和1C。因此,我希望查詢[0]至包含:

{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C", Parent:""} 

接着,我希望查詢[2]包含字符串值屬性爲店2:

{"Prop2A":"2A","Prop2B":"2B","Prop2C":"2C", Parent:"Branch1"} 

接着,我希望查詢[2]爲包含用於僅店3字符串性能,但因爲店3是對象的數組,我希望該數組,以在查詢一起結束[2]:

[ 
{"Prop3A": "3A","Prop3B": "3B","Prop3C": "3C"}, 
{"Prop3D": "3D","Prop3E": "3E","Prop3F": "3F"}, 
{"Prop3G": "3G","Prop3H": "3H","Prop3I": "3I"} 
] 

注意這個科沒有按」還沒有提到它的「Pa租「......我會很高興在查詢[2]中看起來像上面的數組。 (我打算使用DBC的邏輯來一個「父」屬性添加到每個數組元素或想出一個辦法來創建一個包含數組,並引用父只有一次新的JObject):

[{"Prop3A": "3A","Prop3B": "3B","Prop3C": "3C","Parent":"Branch2"}, 
{"Prop3D": "3D","Prop3E": "3E","Prop3F": "3F","Parent":"Branch2"}, 
{"Prop3G": "3G","Prop3H": "3H","Prop3I": "3I","Parent":"Branch2"} 
] 

所以,你可以看到: *我想要任何不是數組的JSON分支作爲一個新的JObject插入到查詢結果中,只有它的字符串屬性和對其父分支的引用。 *我想要任何JSON分支是一個數組,作爲一個新的JObject數組插入到查詢結果中,以及只有其字符串屬性和對其父分支的引用。

我自己解決這個問題的麻煩是與如何在Linq中創建「if myJsonObject is JArray」條件並且在分支不是數組時重新分配字符串屬性屬性有關數組的元素,當它是一個JArray。我懷疑我需要以某種方式利用? :三元表達,但我不完全知道如何做到這一點。

從以前的查詢有問題就在這裏:

var query3 = from o in root.DescendantsAndSelf().OfType<JObject>()  // Find objects 
      let l = o.Properties().Where(p => p.Value is JValue)  // Select their primitive properties 
      where l.Any()            // Skip objects with no properties 
      // Add synthetic "Parent" property 
      let l2 = l.Concat(new[] { new JProperty("Parent", o.Ancestors().OfType<JProperty>().Skip(1).Select(a => a.Name).FirstOrDefault() ?? "") }) 
      select new JObject(l2);         // And return a JObject. 

var list3 = query3.ToList(); 

代碼不以上述方式處理數組。

謝謝您的閱讀!

+1

你提出的JSON'查詢[2]',簡化爲'{ \t [ 「Prop3A」: 「3A」 ],「Parent」:「Branch2」 }',無效。從[standard](http://www.json.org/)中,JSON容器可以是對象 - 由大括號包圍的無序名稱/值對集合,也可以是數組 - 由括號括起來的一組有序值。你提出的JSON有一個值,然後是一個名稱/值對,所以既不是。上傳到http://jsonlint.com/,你會看到問題。 – dbc

+0

所以對不起 - 我很累,完全拙劣的JSON(我通常使用JSLint,但沒有在這種情況下...)TY和固定的問題... – Jazimov

回答