如何解决我怎样才能将此JSON转换为C#中的对象?
两天来,我一直在尝试了解如何将此JSON移至C#中的对象。我阅读了很多主题,并尝试了几种方法来解决我的问题,但仍然没有解决。 我的JSON看起来像这样(已裁剪)。
{
"data": [{
"id": 5643793,"title": "It's a Title","description": "It's a Description.","tags": "#tag1 #tag2 #tag3 #tag4","source_url": "https:\/\/p.dw.com\/p\/3geny","vote_count": 120,"bury_count": 17,"comments_count": 33,"related_count": 0,"date": "2020-08-10 09:43:32","author": {
"login": "lnwsk","color": 2,"avatar": "https:\/\/www.api.page.com\/cdn\/c3397992\/lnwsk_MfQz8MEQb2,q150.jpg"
},"preview": "https:\/\/www.api.page.com\/cdn\/c3397993\/link_1597045214DgzqxRGEmy2UlpPZwaWfhI,w104h74.jpg","plus18": false,"status": "promoted","can_vote": true,"is_hot": false
}],"pagination": {
"next": "https:\/\/api.page.com\/links\/promoted\/appkey\/X*******4y\/page\/2\/"
}
}
如您所见,这里有一个“元素内的元素”(例如作者或分页(例如我想摆脱的分页)),这是给我最大的问题。
在我的课堂上,我拥有所有读取API的代码:
using Newtonsoft.JSON;
public class PageAPI
{
public class Product
{
public string[] title { get; set; }
public double[] description { get; set; }
public string[] tags { get; set; }
public string[] source_url { get; set; }
public string[] vote_count { get; set; }
public string[] bury_count { get; set; }
public string[] comments_count { get; set; }
public string[] related_count { get; set; }
public string[] date { get; set; }
}
public async Task<Product> GetDataAsync()
{
string url = "https://api.page.com/";
string apisign = "6*********c1fe49a23f19ad6b2";
string requestParams = "links/promoted/appkey/X*******y";
Product obj = null;
// HTTP GET.
using (var client = new HttpClient())
{
// Setting Base address.
client.BaseAddress = new Uri(url);
// Setting content type.
client.DefaultRequestHeaders.Add("apisign",apisign);
// Initialization.
HttpResponseMessage response = new HttpResponseMessage();
// HTTP GET
response = await client.GetAsync(requestParams).ConfigureAwait(false);
// Verification
if (response.IsSuccessStatusCode)
{
try
{
// Reading Response.
string result = response.Content.ReadAsStringAsync().Result;
obj = JsonConvert.DeserializeObject<Product>(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
MessageBox.Show(ex.Message);
}
}
else
{
obj = null;
}
}
return obj;
}
}
在我要从“ PageAPI”类中获取数据的表单中:
private async void Form1_LoadAsync(object sender,EventArgs e)
{
var task = api.GetMainAsync();
task.Wait();
var data = task.Result;
label1.Text = data.title[0];
}
而且...这不起作用-在label1.Text = data.title[0];
上,我收到错误消息PageAPI.Product.title.get returned null
感谢您的帮助!
解决方法
您缺少具有“数据”和“分页”属性的Root类。创建Root类并反序列化它,然后获取所需的数据。另外,您的Product类将仅包含字符串。没有string []。
public class RootObject
{
public List<Product> data { get; set; }
}
public class Product
{
public string title { get; set; }
public double description { get; set; }
public string tags { get; set; }
public string source_url { get; set; }
public string vote_count { get; set; }
public string bury_count { get; set; }
public string comments_count { get; set; }
public string related_count { get; set; }
public string date { get; set; }
}
// and deserialize it
var rootObj = JsonConvert.DeserializeObject<RootObject>(result);
obj = rootObj.data.FirstOrDefault();
data
对象是一个数组...您可以遍历它来处理所有项目。在上面的示例中,我使用FirstOrDefault()从对象中获取了第一项。
另请注意,访问此数据时,不会通过[0]访问它。只需使用
label1.Text = data.title;
旁注
如果还需要分页属性,请创建另一个类以从分页对象获取名称。
public class RootObject {
public List<Product> data {get;set;}
public Pagination pagination {get;set;}
}
public class Pagination {
public string next {get;set; }
}
反序列化json时,您将使用来访问分页,
Console.WriteLine(rootObj.pagination.next); // prints the url
如何显示所有产品名称
这就是获取数据对象中所有标题的列表的方式。
foreach (var product in rootObj.data)
{
Console.WriteLine(product.title);
Console.WriteLine(product.description);
Console.WriteLine(product.vote_count); // etc.
}
// Or you can create a list of all the titles from the rootObj using LINQ
List<string> allTitles = rootObj.data.Select(x => x.title).ToList();
我不确定您打算如何处理获得的数据...所以不确定如何解释该部分。.但是上面的示例应该为您提供一个关于如何遍历数据对象中所有产品的想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。