JSON 反序列化以获得一些特定的 objects 并使用 C# 以新的 Json 格式序列化
JSON Deserialization to get some particular objects and Serialize with new Json format using C#
对于我的项目,我需要反序列化来自维基百科的长 JSON 数据。然后我需要从 JSON 中获取一些特定信息,例如标题、提取物、缩略图来源、Co-ordinates。获得所有这些数据后,我需要以新格式 JSON.Hence 再次序列化它 我为 this.But 编写了一个代码,但此代码存在很多问题。除了我的编码,我还描述了每个错误。
我正在使用来自维基百科的api
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
我的 C# object 这个 json 如下-
public class Coordinate
{
public double lat { get; set; }
public double lon { get; set; }
public string primary { get; set; }
public string type { get; set; }
public string dim { get; set; }
public string globe { get; set; }
}
public class Thumbnail
{
public string source { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Page
{
public int pageid { get; set; }
public int ns { get; set; }
public string title { get; set; }
public string extract { get; set; }
public List<Coordinate> coordinates { get; set; }
public Thumbnail thumbnail { get; set; }
}
public class Query
{
public List<Page> pages { get; set; }
}
public class RootObject
{
public bool batchcomplete { get; set; }
public Query query { get; set; }
}
现在我创建一个 C# Class 来序列化我的结果 Json object。我希望我的最终Json这样-
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; }
}
我正在使用此代码反序列化和序列化 JSON objects。但是我在代码旁边提到了很多问题。
已编辑代码
using (WebClient client = new WebClient())
{
try
{
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<Poi> poi = new List<Poi>();
foreach (var page in json.query.pages)
{
Poi obj = new Poi();
obj.Title = page.title;
obj.Description =page.extract ;
var Image = new PoiImage();
var ImgfirstKey = page.thumbnail.source;
Image.ImageID = string.Format("{0:X}.jpg", ImgfirstKey.GetHashCode());
obj.Images = new List<PoiImage> {Image};
obj.Lat = page.coordinates.First().lat;
obj.Lon = page.coordinates.First().lon;
poi.Add(obj);
}
JsonSerializerSettings serializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented };
string result= Newtonsoft.Json.JsonConvert.SerializeObject(poi, serializerSettings);
Console.WriteLine(result);
}
catch(Exception)
{
}
}
只需将序列化代码移到 foreach
之外
并序列化 list<poi>
foreach (page in rootObject.Query.Pages){
//do the magic
//then
poi.add(obj)
}
JsonSerializerSettings serializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented };
Newtonsoft.Json.JsonConvert.SerializeObject(poi, serializerSettings);
对于我的项目,我需要反序列化来自维基百科的长 JSON 数据。然后我需要从 JSON 中获取一些特定信息,例如标题、提取物、缩略图来源、Co-ordinates。获得所有这些数据后,我需要以新格式 JSON.Hence 再次序列化它 我为 this.But 编写了一个代码,但此代码存在很多问题。除了我的编码,我还描述了每个错误。
我正在使用来自维基百科的api
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
我的 C# object 这个 json 如下-
public class Coordinate
{
public double lat { get; set; }
public double lon { get; set; }
public string primary { get; set; }
public string type { get; set; }
public string dim { get; set; }
public string globe { get; set; }
}
public class Thumbnail
{
public string source { get; set; }
public int width { get; set; }
public int height { get; set; }
}
public class Page
{
public int pageid { get; set; }
public int ns { get; set; }
public string title { get; set; }
public string extract { get; set; }
public List<Coordinate> coordinates { get; set; }
public Thumbnail thumbnail { get; set; }
}
public class Query
{
public List<Page> pages { get; set; }
}
public class RootObject
{
public bool batchcomplete { get; set; }
public Query query { get; set; }
}
现在我创建一个 C# Class 来序列化我的结果 Json object。我希望我的最终Json这样-
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; }
}
我正在使用此代码反序列化和序列化 JSON objects。但是我在代码旁边提到了很多问题。
已编辑代码
using (WebClient client = new WebClient())
{
try
{
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<Poi> poi = new List<Poi>();
foreach (var page in json.query.pages)
{
Poi obj = new Poi();
obj.Title = page.title;
obj.Description =page.extract ;
var Image = new PoiImage();
var ImgfirstKey = page.thumbnail.source;
Image.ImageID = string.Format("{0:X}.jpg", ImgfirstKey.GetHashCode());
obj.Images = new List<PoiImage> {Image};
obj.Lat = page.coordinates.First().lat;
obj.Lon = page.coordinates.First().lon;
poi.Add(obj);
}
JsonSerializerSettings serializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented };
string result= Newtonsoft.Json.JsonConvert.SerializeObject(poi, serializerSettings);
Console.WriteLine(result);
}
catch(Exception)
{
}
}
只需将序列化代码移到 foreach
之外
并序列化 list<poi>
foreach (page in rootObject.Query.Pages){
//do the magic
//then
poi.add(obj)
}
JsonSerializerSettings serializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented };
Newtonsoft.Json.JsonConvert.SerializeObject(poi, serializerSettings);