循环在使用 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.
- SwaggerResponse 类型的变化。
- 您的 try 语句中的 poi.Add()。
- poi 的 return - 你的答案列表,不是结果。
- 您需要在控制器顶部为 System.Collections.Generic 添加一个 using 如果那里还没有。
祝你的应用程序好运!
我正在尝试反序列化 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.
- SwaggerResponse 类型的变化。
- 您的 try 语句中的 poi.Add()。
- poi 的 return - 你的答案列表,不是结果。
- 您需要在控制器顶部为 System.Collections.Generic 添加一个 using 如果那里还没有。
祝你的应用程序好运!