簡體   English   中英

使用 Linq 查詢復雜的 Json

[英]Querying a complex Json with Linq

我想在 json 字符串中進行 Linq 查詢。

關於我正在嘗試做的事情的信息很少。 在工作中,我們有一個基於 Web 的日程安排系統,它不支持 Windows 8 和 Windows Phone 8 應用程序。 這就是為什么我決定做一個。 使用 HttpClient 我得到一個 http 字符串,然后我將其轉換為 xml 然后是 Json。 正如您從(下面的鏈接,'TheWholeJsonString.json' 文件)中看到的,屬性名稱和 JSON 對象名稱沒有提供信息,並且 JSON 文件很復雜 這就是為什么我決定從 JSON 字符串中提取一些值並編寫一個全新的 JSON 文件,該文件以更翔實的方式包含提取的 JSON 值。

原始 JSON 文件中的 [tr] 數組有幾個 JSON 對象。 在鏈接文件夾中的“VeryShorten.json”文件中,您可以看到其中一個對象的結構(OBS!有不同結構的對象)。 我唯一隱藏的是 RL ppl 的姓名和電子郵件地址。

我還附上了“ShortenVersion.json”,它只是整個 json 字符串的縮短版本,只是為了便於處理。

Json 數據示例

{
    "@class": "odd",
    "td": [
      {
        "@class": "user",
        "@onmouseover": "userInfo('149');",
        "@onmouseout": "userInfo(0);",
        "@onmousemove": "moveSlotInfo();",
        "#text": " ",
        "a": {
          "@href": "Name3@dreamnet.com",
          "#text": "Name3"
        }
      },
      .
      .
      .

在 C# 中,如果我嘗試以下代碼(不是 Linq)

var jObject = JObject.Parse(jString); //jString is 'TheWholeJsonString.json' file in the attached link

var jObj = jObject["tbody"]["tr"][8];
var gh = jObj.Value<JToken>("td").Children().First().Value<JToken>("a").Value<string>("#text");

我可以獲得'#text'的值,即*'Name3'。

但是,如果我嘗試以下代碼(Linq 版本):-

var jObject = JObject.Parse(jString);
var jCollection = jObject["tbody"]["tr"].Children();
var test = from userToken in jCollection
            where
                userToken.Value<JToken>("td")
                    .Children()
                    .First()
                    .Value<JToken>("a")
                    .Value<string>("#text")
                    .Contains("Name3")
            select (string)userToken["#text"];
foreach (var item in test)
{
   var fgh = item.Type;
}

它將在 foreach 循環的第一次迭代中中斷,並顯示以下錯誤消息“無法訪問 Newtonsoft.Json.Linq.JValue 上的子值”。 我現在真的是什么原因導致了這個問題,但我不知道如何解決它。 問題是並非 jCollection 中的每個標記都有一個 'td' 對象,即使該標記有 'td' 對象,它也不總是具有標記 'a'。 您可以在我在鏈接中附加的“TheWholeJsonString.json”或“ShortVersion.json”文件中看到這一點。 希望這能解釋更多信息。

所以問題是:- 任何人都可以幫助解決這個問題?

您可以使用 SelectTokens 方法。 請注意false作為第二個參數 - 如果未找到元素,則不要生成錯誤。

var jObject = JObject.Parse(jString);
var trList = jObject["tbody"]["tr"];
string[] names = trList.SelectMany(tr => tr.SelectTokens("td[0].a.#text", false))
                       .Select(t => t.Value<string>())
                       .ToArray();

您可以像這樣使用 LINQ 輕松查詢

考慮這個 JSON

{
    "items": [
        {
            "id": "10",
            "name": "one"
        },
        {
            "id": "12",
            "name": "two"
        }
    ]
}

像這樣把它放在一個名為json的變量中,

JObject json = JObject.Parse("{'items':[{'id':'10','name':'one'},{'id':'12','name':'two'}]}");

您可以使用以下 LINQ 查詢從名稱為"one"的項目中選擇所有 ID

var Ids =
    from item in json["items"]
    where (string)item["name"] == "one"
    select item["id"];

暫無
暫無

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

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