循环在使用 Web Api Controller ASP.NET MVC 的 JSON 序列化中不起作用

Looping does not work in JSON serialization using Web Api Controller ASP.NET MVC

我正在尝试反序列化 json 来自维基百科 api 的数据。我只想获取图像信息,然后为我自己格式化的 JSON 数据再次序列化。但是我的代码中的问题是它只显示列表中的最后一个数据,而不是整个 data.The foreach 循环不工作。

我反序列化和序列化 json 对象的代码如下所示-

[SwaggerResponse(HttpStatusCode.OK, "A", typeof(PoiImageAnswer))]
    [SwaggerResponse(HttpStatusCode.BadRequest, "Empty Answer", typeof(ModelStateDictionary))]
    [SwaggerResponse(HttpStatusCode.InternalServerError, "No Response")]
    [HttpPost]
    [ActionName("Image")]
    public IHttpActionResult Image([FromBody] PoiImageRequest request)
    {
        var result = new PoiImageAnswer {TransactionID = request.TransactionID};



       using (WebClient client = new WebClient())
       {
        var response = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&redirects=1&generator=geosearch&prop=extracts|coordinates|pageimages&ggslimit=20&ggsradius=1000&ggscoord=52.5243700|13.4105300&&formatversion=2&exintro=1&explaintext=1&exlimit=20&coprop=type|dim|globe&colimit=20&piprop=thumbnail&pithumbsize=400&pilimit=20");
        var json = JsonConvert.DeserializeObject<RootObject>(response);

        List<PoiImageAnswer> poi = new List<PoiImageAnswer>();

        foreach (var page in json.query.pages)
          {

              try
               {

                var Img= page.thumbnail.source;
                result.Title = page.title;
                result.Height = page.thumbnail.height;
                result.Width = page.thumbnail.width;
                result.ImageData = string.Format("{0:X}.jpg", page.thumbnail.source.GetHashCode());
                result.TransactionID = request.TransactionID;
            }
            catch (Exception)
            {

            }

         }       
           return Ok(result);
         }

       }
    }

我的 C# class for json object 如下用于理解代码,

 public class PoiImageAnswer
 {
    public string ImageID { set; get; }
    public string Title { set; get; }
    public int Width { set; get; }
    public int Height { set; get; }
    public string ImageData { set; get; }
    public long TransactionID { set; get; }
 }


 public class Poi
 {
   public string Title { set; get; }
   public string Description { set; get; }
   public List<PoiImage> Images { set; get; }
   public string OpeningHours { set; get; }
   public double AirDistanceInKm { set; get; }
   public double Lon { set; get; }
   public double Lat { set; get; }
 }

  public class PoiImage
  {
   public string ImageID { set; get; }
  }

我得到这样的输出,这是列表中的最后一个对象-

{
"ImageID": null,
"Title": "1976 Conference of Communist and Workers Parties of Europe",
 "Width": 243,
 "Height": 400,
 "ImageData": "53E5DCF3.jpg",
 "TransactionID": 0

}

您需要如下代码。注意:我还没有测试过它,但它应该可以工作。

public IHttpActionResult Image([FromBody] PoiImageRequest request)
    {            
        var resultList = new List<PoiImageAnswer>();

        using (WebClient client = new WebClient())
        {
            var response = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&redirects=1&generator=geosearch&prop=extracts|coordinates|pageimages&ggslimit=20&ggsradius=1000&ggscoord=52.5243700|13.4105300&&formatversion=2&exintro=1&explaintext=1&exlimit=20&coprop=type|dim|globe&colimit=20&piprop=thumbnail&pithumbsize=400&pilimit=20");
            var json = JsonConvert.DeserializeObject<RootObject>(response);

            foreach (var page in json.query.pages)
            {

                try
                {
                    var result = new PoiImageAnswer();
                    var Img = page.thumbnail.source;
                    result.Title = page.title;
                    result.Height = page.thumbnail.height;
                    result.Width = page.thumbnail.width;
                    result.ImageData = string.Format("{0:X}.jpg", page.thumbnail.source.GetHashCode());
                    result.TransactionID = request.TransactionID;
                    resultList.Add(result);
                }
                catch (Exception)
                {

                }

            }
            return Ok(resultList);
        }

    }

您需要编译并发回一个列表。您正在执行 foreach 循环,但没有编译列表并将其发送到视图。

您的代码应如下所示(未经测试):

[SwaggerResponse(HttpStatusCode.OK, "A", typeof(List<PoiImageAnswer>))]
[SwaggerResponse(HttpStatusCode.BadRequest, "Empty Answer", typeof(ModelStateDictionary))]
[SwaggerResponse(HttpStatusCode.InternalServerError, "No Response")]
[HttpPost]
[ActionName("Image")]
public IHttpActionResult Image([FromBody] PoiImageRequest request)
{
    using (WebClient client = new WebClient())
    {
        var response = client.DownloadString("https://en.wikipedia.org/w/api.php?format=json&action=query&redirects=1&generator=geosearch&prop=extracts|coordinates|pageimages&ggslimit=20&ggsradius=1000&ggscoord=52.5243700|13.4105300&&formatversion=2&exintro=1&explaintext=1&exlimit=20&coprop=type|dim|globe&colimit=20&piprop=thumbnail&pithumbsize=400&pilimit=20");
        var json = JsonConvert.DeserializeObject<RootObject>(response);
        List<PoiImageAnswer> poi = new List<PoiImageAnswer>();
        foreach (var page in json.query.pages)
        {
            try
            {
                poi.Add(new PoiImageAnswer {
                    TransactionID = request.TransactionID,
                    Title = page.title,
                    Height = page.thumbnail.height,
                    Width = page.thumbnail.width,
                    ImageData = string.Format("{0:X}.jpg", page.thumbnail.source.GetHashCode())
                });
            }
            catch (Exception)
            {

            }
        }       
        return Ok(poi);
    }
}

N.B.

  1. SwaggerResponse 类型的变化。
  2. 您的 try 语句中的 poi.Add()。
  3. poi 的 return - 你的答案列表,不是结果。
  4. 您需要在控制器顶部为 System.Collections.Generic 添加一个 using 如果那里还没有。

祝你的应用程序好运!