2017-04-05 25 views
1

一個REST API服務提供了以下JSON我的C#代碼:如何使用JSONPath(或任何其他選項)來查詢未命名的JSON數組?

[ 
    { 
    "contentUri": "https://somewhere.com/aGuid1", 
    "contentId": "2" 
    }, 
    { 
    "contentUri": "https://somewhere.com/aGuid2", 
    "contentId": "3" 
    }, 
    { 
    "contentUri": "https://somewhere.com/aGuid3", 
    "contentId": "4" 
    } 
] 

以上JSON簡化,實際響應是一個非常大的字符串,所以是字符串操作將是昂貴且佔用大量內存。

問題是上面的JSON數組沒有名稱。所以我不能將它解析成JArray,除非我操作JSON字符串併爲其添加一個名稱。我喜歡避免這種情況。

我可以完全解析JSON之上的JToken。現在,我喜歡用JToken.SelectTokenJSONPath

  • 什麼JSONPath返回所有元素的上述JSON陣列的JToken內查詢?

  • 什麼JSONPath返回上面的JSON數組中的所有contentUri值?

我試過很多JSONPath查詢,但沒有鎖定,因爲數組沒有名稱。

回答

3

你可以非常容易地分析上面的JSON爲JArray

JArray array = JArray.Parse(jsonString); 

要獲得陣列中的所有對象,你不需要JSONPath表情,只是環陣列上:

foreach (JObject child in array) 
{ 
    Console.WriteLine("contentUri: " + (string)child["contentUri"]); 
    Console.WriteLine("contentId: " + (string)child["contentId"]); 
} 

爲了完整起見,用於獲取所有數組值的等效JSONPath表達式爲[*]。但是這裏並不真的給你買東西。

只得到所有contentUri值,你可以使用SelectTokens與JSONPath [*].contentUri

foreach (JToken uri in array.SelectTokens("[*].contentUri")) 
{ 
    Console.WriteLine(uri); 
} 

或者,你可以只Select他們是這樣的:

foreach (string uri in array.Select(t => (string)t["contentUri"])) 
{ 
    Console.WriteLine(uri); 
} 

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

相關問題