【问题标题】:Get all the titles after deserialiaztion json using C# and Json.net使用 C# 和 Json.net 获取反序列化 json 后的所有标题
【发布时间】:2016-02-23 08:43:29
【问题描述】:

我正在使用一个 wikipedia api,其中包含来自 wikipedia 文章的所有地方的外部链接。我的维基百科 api 调用是: https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gspage=Berlin&gslimit=500&gsprop=type|name|dim|country|region|globe&format=json

我使用 JsonToCsharp 为 json 对象制作 c# 类,如下所示:

  public class Geosearch
  {
    public int pageid { get; set; }
    public int ns { get; set; }
    public string title { get; set; }
    public double lat { get; set; }
    public double lon { get; set; }
    public double dist { get; set; }
    public string primary { get; set; }
    public string type { get; set; }
    public string name { get; set; }
    public object dim { get; set; }
    public string country { get; set; }
    public string region { get; set; }
  }

 public class Query
 {
   public List<Geosearch> geosearch { get; set; }
 }  

 public class RootObject
 {
  public string batchcomplete { get; set; }
  public Query query { get; set; }
 }

我的反序列化代码如下。使用此代码我只有一个标题。但我想从这个 api 中得到所有的标题。我知道我应该创建一个 foreach 循环,但无法获得如何实现它的逻辑。

static void Main(string[] args)
    {
        WebClient client = new WebClient();
        var GeoResponse = client.DownloadString("https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gspage=Berlin&gslimit=500&gsprop=type|name|dim|country|region|globe&format=json");

        RootObject json = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<RootObject>(GeoResponse);

        var firstKey = json.query.geosearch.First().title;

        Console.WriteLine(firstKey);

    }

【问题讨论】:

  • 改用JSON.Net

标签: c# deserialization wikipedia-api json-deserialization


【解决方案1】:

这很好用 -

var o = new HttpClient();
var res = new StreamReader(o.GetStreamAsync("https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gspage=Berlin&gslimit=500&gsprop=type|name|dim|country|region|globe&format=json").Result).ReadToEnd() ;
var obj = JsonConvert.DeserializeObject<RootObject>(res).query.geosearch.Select(a => a.title).ToList();
// count == 500
obj.Foreach(a => Console.WriteLine(a));

【讨论】:

  • 显示 HttpClient 错误 2 找不到类型或命名空间名称“HttpClient”(您是否缺少 using 指令或程序集引用?)
  • 您必须添加对System.Net.Http 程序集的引用
  • 但它显示为输出 System.Collections.Generic.List'[System.String]。不是清单。我以这种方式修改了我的代码-var o = new HttpClient(); var res = new StreamReader(o.GetStreamAsync("en.wikipedia.org/w/…; var obj = JsonConvert.DeserializeObject(res).query.geosearch.Select(a => a.title).ToList(); Console.WriteLine( obj);
  • objstring 的列表。您将遍历集合并一次打印每个。我已经编辑了代码。
【解决方案2】:

我刚刚修改了我的代码,它运行良好。

 var response = client.GetAsync("https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gspage=Berlin&gslimit=500&gsprop=type|name|dim|country|region|globe&format=json").Result;

            if (response.IsSuccessStatusCode)
            {

                var responseContent = response.Content;

                string responseString = responseContent.ReadAsStringAsync().Result;

                var obj = JsonConvert.DeserializeObject<RootObject>(responseString).query.geosearch.Select(a => a.title).ToList();

                foreach (var item in obj)
                {
                    Console.WriteLine(item);
                }
            }
        }

【讨论】:

  • 我做了同样的事情,但不同。
  • @AmitKumarGhosh:谢谢。但是我的代码出错了。所以我只是尝试了不同的方式。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多