1

Я пытаюсь уничтожить данные json из wikipedia api. Я хочу получить только информацию об изображении, а затем снова выполнить сериализацию для своих форматированных данных JSON. Но проблема в моем коде заключается в том, что в нем отображаются только последние данные из списка, а не все данные. Цикл foreach не работает.Looping не работает в JSON-сериализации с использованием Web Api Controller ASP.NET MVC

Мой код для Deserialize и сериализовать объект JSON является выглядеть this-

[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# класс для объекта JSON является, как показано ниже для понимания кода,

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 

+0

Это потому, что переменная результата типа PoiImageAnswer - это единственный объект, а не коллекция. Если вам нужны все элементы из списка, вам нужна коллекция, в которой вы будете хранить форматированный json-объект, а затем эту коллекцию, которую вы должны отправить в качестве результата. –

+0

@PankajKapare, Не могли бы вы объяснить мне, как я могу это сделать. В этом случае я очень новичок. Спасибо. –

+0

Гарри, вам нужно освежить коллекции в .NET; пространство имен System.Collections.Generic, в частности, для обработки списков. Удачи! –

ответ

1

Вам нужен код, как показано ниже. Примечание. Я не тестировал его, но он должен работать.

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); 
     } 

    } 
+0

Thnk вам очень нравится. ваш код работает. Но у меня есть небольшой вопрос: как установить значение var result = new PoiImageAnswer {TransactionID = request.TransactionID}; потому что в вашем коде вы написали var resultList = new List (); –

+0

result.TransactionID = request.TransactionID; Эта строка уже обновляет TransactionId, поэтому вам не нужно ее инициализировать при объявлении. –

+0

Спасибо за объяснение –

1

Вам необходимо скомпилировать и отправить список. Вы выполняете цикл 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); 
    } 
} 

нотабене

  1. Изменение типа вашего SwaggerResponse.
  2. poi.Add() в вашем заявлении try.
  3. Возврат poi - ваш список ответов, а не результат.
  4. Вам нужно будет добавить использование в верхней части контроллера для System.Collections.Generic, если его еще нет.

Удачи вам в приложении!

+0

Спасибо большое за объяснение: Теперь у меня есть результат. Но у меня есть небольшой вопрос, что мне делать в этой строке var result = new PoiImageAnswer {TransactionID = request.TransactionID}; –

+0

Это уже установлено, гарри, посмотрите в попытке.Вам не нужна эта оригинальная строка наверху. –

+1

Большое спасибо. Да, теперь я понимаю. –