0

我正在使用 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 类成员。我的问题是,是否有更好的方法来找到条目数组中键 ==“排名”的“值”,而不仅仅是循环遍历它并检查每个键。我找不到任何 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);
            }

        }
    }
}
4

2 回答 2

1

如果您计划为每个 JSON 结果查找多个值,那么将数据放入数据结构中可能是值得的,这样可以更有效地搜索您要查找的内容。例如,您可以创建一个Dictionary将键映射到值的方法,但是如果您只想搜索一次数据结构,那么创建它Dictionary会比您正在做的工作更多,所以您应该留下您的代码事情是这样的。

您可能会减少执行您想要的操作所需的代码量(乍一看,一些简化很明显),但搜索所有内容的底层算法不会改变。

于 2012-12-11T22:26:41.250 回答
1

简单的回答,不。你可以让其他东西为你做一些循环,但这并不意味着你会想出一个使用 LINQ 性能更好的解决方案(它也只是循环集合)。

如果您的目标只是清理可以序列化为对象的代码,那么您的代码中将有一个更简单的循环(当然 json.NET 会进行大量循环);

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

虽然我个人不建议这样做。我喜欢简单的方法。另一个(愚蠢的)想法是使用 RegEx。您的行数会更少,但性能会更差。基本上,您不会删除迭代,您可以使用抽象来完成其中的一些,但实际上没有意义。我会坚持你所拥有的,除非你要对 json 做更多的事情。如果您打算在其他地方使用 json 做更多事情,那么我将序列化为一个对象。

于 2012-12-11T22:34:43.747 回答