2017-07-27 77 views
1

這個問題是非常相關的以下內容的JSON對象查詢JSON SelectTokens對於具有結構變化

Querying JSON with JSONPath or SelectTokens? With JSON.NET in C#

到上面的問題一樣,如何才能讓Where查詢時的JSON對象並不總是具有相同的簡化的數據結構,即

{ 
    "video": { 
    "local_recording_device": { 
     "codecs": null 
    }, 
    "preferred_string": "___PREFERRED___", 
    "streams": { 
     "22855218": { 
     "id": "22855218", 
     "name": "AJA Camera" 
     }, 
     "99176901": { 
     "id": "99176901", 
     "name": "PTZ Camera", 
     "site": "someone", 
     "email": "[email protected]", 
     "codec": [ 
      "VP8", 
      "HD1", 
      "(720p)" 
     ] 
     }, 
     "3091494011": { 
     "id": "3091494011", 
     "name": "Logitech Webcam C930e", 
     "site": "Joe Smith", 
     "email": "[email protected]", 
     "codec": [ 
      "VP8", 
      "Medium", 
      "(CIF)" 
     ] 
     }, 
     "3798287599": { 
     "id": "3798287599", 
     "name": "Drive Camera", 
     "site": "ASiteName", 
     "email": "[email protected]", 
     "codec": [ 
      "HD1", 
      "(720p)" 
     ] 
     } 
    } 
    } 
} 

我怎樣才能獲得Where查詢,以便對給定的編解碼器,如工作「VP8」?

它似乎沒有,如果我查詢它像這樣與我的應用程序一起工作:

string json = GetJson(); 
var obj = JObject.Parse(json); 
var testcodec = "VP8"; 

var streamQuery = obj.SelectTokens("video.streams.*.codec") 
        .Where(s =>(string)s == testcodec); 

但我的結果應該是這樣的:

{ 
    "video":{ 
    "local_recording_device":{ 
     "codecs":null 
    }, 
    "preferred_string":"___PREFERRED___", 
    "streams":{ 
     "99176901":{ 
      "id":"99176901", 
      "name":"PTZ Camera", 
      "site":"someone", 
      "email":"[email protected]", 
      "codec":[ 
       "VP8" 
      ] 
     }, 
     "3091494011":{ 
      "id":"3091494011", 
      "name":"Logitech Webcam C930e", 
      "site":"Joe Smith", 
      "email":"[email protected]", 
      "codec":[ 
       "VP8" 
      ] 
     } 
    } 
    } 
} 
+0

究竟你希望得到和你實際得到什麼? –

+0

我想獲得一個類似於原始結構的數組,但所有元素都滿足我的查詢要求。在這種情況下,具有以下兩個流的完整json樹3091494011,999176901 – Andres

回答

0
var streamQuery = obj.SelectTokens("$.video.streams.*.codec") .Where(x=>x.First.Value<string>()==testcodec); 
+0

雖然此代碼可能回答此問題,但提供有關此代碼爲何和/或如何回答此問題的其他上下文可提高其長期價值。 – Aurril

+0

現在與'obj.SelectTokens(「$。video.streams。*。codec」)'我得到一個空 – Andres

1

您的查詢不因爲它只是要求編解碼器數組,然後試圖將這些數組與字符串值進行比較。您需要一個詢問流的查詢,然後檢查每個流的編解碼器數組是否包含正確的字符串。

嘗試喜歡這個:

var streamQuery = obj.SelectTokens("video.streams.*") 
        .Where(t => t["codec"] != null && 
           t["codec"].Any(c => (string)c == testcodec)); 

然後,你可以做這樣的事情,從查詢結果中獲取數據:

foreach (var stream in streamQuery) 
{ 
    Console.WriteLine("id: " + stream["id"]); 
    Console.WriteLine("name: " + stream["name"]); 
    Console.WriteLine("site: " + stream["site"]); 
    Console.WriteLine("email: " + stream["email"]); 
    Console.WriteLine("codecs: " + string.Join(", ", stream["codec"].Select(c => (string)c))); 
    Console.WriteLine(); 
} 

小提琴:https://dotnetfiddle.net/Ak8PMZ

+0

真棒,幾乎在那裏!在我的編解碼器列表中,我只想得到我正在尋找的單詞,即本例中的編解碼器:[「VP8」]'。你認爲這是可能的嗎? – Andres

+0

你已經知道了 - 它在你的'testcodec'變量中。您已經知道結果中的所有流匹配此編解碼器基於查詢。因此,對於每個結果,您可以簡單地執行'Console.WriteLine(「codec:」+ testcodec);' –

+0

謝謝, 這太有點兒了。我更新了我的問題,非常感謝您的幫助! – Andres