我正在使用 json.net(Newtonsoft)库来解析API json响应。我只需要 id 值和排名值。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 和秩,然后将这些值作为新的 RankScore 对象添加到 List 类成员。我的问题是,是否有更好的方法来查找条目数组中键=="排名"的"值",而不仅仅是遍历它并检查每个键。我找不到任何 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);
}
}
}
}
简单的答案,没有。你可以让其他东西为你做一些循环,但这并不是说你要想出一个通过使用 LINQ 性能更好的解决方案(它也只是循环集合)。
如果你的目标只是清理代码,你可以序列化到一个对象中,那么你的代码中就会有一个更简单的循环(当然 json.NET 会做大量的循环);
for (int i = 0; i < Obj.items.Length; i++)
{
Obj.items[i].id //do something with this here
}
虽然我个人不建议这样做。我喜欢简单的方法。另一个(愚蠢的)想法是使用正则表达式。您的行会更少,但性能会差得多。基本上,你不会删除迭代,你可以使用抽象来做一些迭代,但真的没有意义。我会坚持你所拥有的,除非你要用 json 做更多的事情。如果您打算在其他地方使用 json 做更多的事情,那么我会序列化为一个对象。
如果您打算在每个 JSON 结果中查找多个值,那么将数据放入数据结构中可能是值得的,该结构可以更有效地搜索您要查找的内容。 例如,您可以创建一个将键映射到值的Dictionary
,但是如果您只打算搜索一次数据结构,那么创建该Dictionary
将比您正在执行的工作更多,因此您应该保持代码原样。
您可以减少执行所需操作所需的代码量(乍一看,一些简化很突出),但搜索所有内容的基础算法不会改变。