簡體   English   中英

LINQ方法在沒有循環的情況下查找特定鍵的值? (在C#中解析json)

[英]LINQ method to find the value for a specific key without looping? (Parsing a json in C#)

我正在使用json.net(Newtonsoft)庫來解析API json響應。 我只需要id值和rank值。 json看起來像這樣:

{"items":
    [
        {"fields":
            {"entry":
                [
                    {"key":"Customer","value":"ABC Electronics"},
                    {"key":"Status","value":"Untouched"},
                    {"key":"Amount","value":"$1000"},
                    {"key":"rank","value":"3.0"}
                ]
            },
            "id":"1001",
            "owner":"dave@sales123.com"
        },
        {"fields":
            {"entry":
                [
                    {"key":"Customer","value":"General Products"},
                    {"key":"Status","value":"Developing"},
                    {"key":"Amount","value":"$6000"},
                    {"key":"rank","value":"6.0"}
                ]
            },
            "id":"1002",
            "owner":"john@sales123.com"
        }
    ]
}

我在我的類中有一個方法來發出請求,循環遍歷json並獲取id和rank,然后將這些值作為新的RankScore對象添加到List類成員。 我的問題是,是否有更好的方法來找到條目數組中鍵==“rank”的“值”,而不僅僅是循環遍歷它並檢查每個鍵。 我無法找到任何LINQ方式?

public void MakeRequest(apiURL) {
    var requestUrl = new Uri(apiUrl, "/ranks/0");
    HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
    request.Credentials = new NetworkCredential(this.Username, this.Password);

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var token = JObject.Parse(reader.ReadToEnd());
            var items = token["items"];
            foreach (var item in items)
            {
                var id = item.Value<string>("id");
                var entries = item["fields"]["entry"];
                string rank = null;

                // **** Is there a better way to do this? ****
                foreach (var entry in entries) 
                {
                    if (entry.Value<string>("key") == "rank")
                    {
                        rank = entry.Value<string>("value");
                        break;
                    }
                }
                var ranking = new RankScore(int.Parse(id), rank);
                this.Ranks.Add(ranking);
            }

        }
    }
}

如果您計划根據JSON結果查找多個值,那么獲取數據並將其放入數據結構中可能是值得的,這樣可以更有效地搜索您要查找的內容。 例如,您可以創建一個將鍵映射到值的Dictionary ,但如果您只想搜索數據結構一次,那么創建該Dictionary將比您正在進行的工作更多,所以您應該離開你的代碼就像它一樣。

您可能會減少執行所需操作所需的代碼量(乍一看有些簡化)但搜索所有內容的基礎算法不會更改。

簡單回答,沒有。 你可以讓別的東西為你做一些循環,但是你不會想出一個使用LINQ(它也只是循環遍歷集合)的表現更好的解決方案。

如果你的目標只是清理你的代碼,你可以序列化為一個對象,那么你的代碼中就會有一個更簡單的循環(當然json.NET會做很多循環);

for (int i = 0; i < Obj.items.Length; i++)
{
    Obj.items[i].id //do something with this here
}

雖然我個人不建議這樣做。 我喜歡簡單的方法。 另一個(愚蠢的)想法是使用RegEx。 你會有更少的線,但性能更差。 基本上,你不會刪除迭代,你可以使用抽象來做一些,但實際上沒有意義。 我會堅持你擁有的東西,除非你要用json做更多的事情。 如果您打算在其他地方使用json做更多事情,那么我會序列化為一個對象。

暫無
暫無

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

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