如何解决反序列化JSON数组与列表
所以我正在使用以下myMarketNews api:https://mymarketnews.ams.usda.gov/mars-api/getting-started
我可以使用以下代码自己提取报告列表:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using RestSharp;
using RestSharp.Authenticators;
namespace MarketNewsJson
{
internal static class MarketNewsJson
{
private static void Main(string[] args)
{
var client = new RestClient("https://marsapi.ams.usda.gov")
{
Authenticator = new HttpBasicAuthenticator("mars_test_343343","")
};
var request = new RestRequest("services/v1.1/reports",DataFormat.Json);
var response = client.Get(request);
var reports = JsonConvert.DeserializeObject<List<Report>>(response.Content);
foreach (var report in reports)
{
Console.WriteLine($"{report.SlugId} {report.SlugName} - {report.ReportTitle}");
}
}
}
public class Report
{
[JsonProperty("slug_id")]
public string SlugId { get; set; }
[JsonProperty("slug_name")]
public string SlugName { get; set; }
[JsonProperty("report_title")]
public string ReportTitle { get; set; }
[JsonProperty("published_date")]
public string PublishedDate { get; set; }
[JsonProperty("markets")]
public List<string> Markets { get; set; }
[JsonProperty("market_types")]
public List<string> MarketTypes { get; set; }
[JsonProperty("offices")]
public List<string> Offices { get; set; }
[JsonProperty("sectionNames")]
public List<string> SectionNames { get; set; }
}
}
这将拉出报告名称及其其他属性。但是,我也希望能够为单个报告本身提取JSON信息。我在“排序”选项卡中注意到,它显示了单个报告的属性,并且用于指定单个报告的属性类似于var request = new RestRequest(“ services / v1.1 / reports / 1095”,DataFormat.Json );报告1095本身,而不是所有报告的/ reports。当我这样做时,反序列化时出现错误:
Newtonsoft.Json.JsonSerializationException:'无法反序列化当前JSON对象(例如{“ name”:“ value”})为类型'System.Collections.Generic.List`1 [MarketNewsJson.Report]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。
这是因为单个报告的JSON格式与报告列表本身的格式不同吗?如果是这样,我是否需要换行来对单个报告进行反序列化,而当我要获取单个报告及其属性时,仅将另一行注释掉?
编辑:JSON响应
这就是我当前仅提取报告名称,id和标题(正常工作)时的JSON响应:
[
{
"slug_id": "1034","slug_name": "MD_DA105","report_title": "Whey - Western & Eastern Europe Report","published_date": "07/30/2020 08:25:01","markets": ["N/A"],"market_types": ["Point of Sale"],"offices": ["Madison"],"sectionNames": []
},{
"slug_id": "1035","slug_name": "MD_DA106","report_title": "Skim Milk Powder - Europe","sectionNames": []
}
]
从文档中可以看出,报告的单个数据应该是这样的:
{
"results": [
{
"report_begin_date": "2018-01-08","report_end_date": "2018-01-08","published_date": "2018-01-31","office_name": "Madison","office_code": "DA-MD","office_city": "Madison","office_state": "WI","market_location_name": "National Cold Storage","market_location_city": "","market_location_state": "WI","group": null,"category": "Hard Products","commodity": "Cheese","market_type": "Cold Storage","market_type_category": "Dairy Market","slug_id": "1095","slug_name": "MD_DA953","community": "Dairy","quality": "N/A","holdings_unit": "LBS","holdings_current_lbs": "96009227","holdings_1stDayMTH_lbs": "96245049","holdings_change_lbs": "-235822","holdings_change_percent": "0.0000","currentMTH_1stDay": "2018-01-01","report_narrative": null,"commodity_narrative": null,"special_announcement": null
}
解决方法
您将必须使用两个不同的类。一个用于列表,另一个用于ReportObject。
对于services/v1.1/reports
,您将需要使用帖子中已有的类。但是对于使用services/v1.1/reports/1095
获得的报告,您将需要使用其他类来反序列化您的响应。这主要是因为您得到的响应与没有ID的报告大为不同。
public class ReportResultResponse {
// This is a List of objects even though it might always be a single element in the json
[JsonProperty("results")]
public List<ReportResultForID> Results {get;set;}
}
public class ReportResultForID {
[JsonProperty("report_begin_date")]
public DateTime ReportBeginDate {get;set;}
[JsonProperty("report_end_date")]
public DateTime ReportEndDate {get;set;}
...
[JsonProperty("slug_name")]
public string SlugName {get;set;}
...
}
// Then for the reports you get with ID,you would deserialize like this,var request = new RestRequest("services/v1.1/reports/1095",DataFormat.Json);
var response = client.Get(request);
var reports = JsonConvert.DeserializeObject<ReportResultResponse>(response.Content);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。