使用 DeserializineAsync (JSON/C#) 调用 Web API 以获取特定信息
Posted
技术标签:
【中文标题】使用 DeserializineAsync (JSON/C#) 调用 Web API 以获取特定信息【英文标题】:Calling a Web API to get particular information using DeserializineAsync (JSON/ C#) 【发布时间】:2021-12-13 21:23:56 【问题描述】:我正在尝试调用 Web API(JSON/Csharp 控制台应用程序)我在 dotnet 中执行了相同的步骤:https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient 但是,当我尝试仅获取属性“NAME1”时,出现错误:无法将 JSON 值转换为 System.Collections.Generic.List。我可以获得所有 json 信息,但是在反序列化结果以仅获取特定数据(例如 NAME1)时,它不起作用。
public partial class Result
public List<GAZETTEER_ENTRY> GAZETTEER_ENTRY get; set;
public partial class GAZETTEER_ENTRY
public string ID get; set;
public string NAME1 get; set;
class Program
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
await RunAsync();
private static async Task RunAsync()
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("key", "xxxxxx");
var streamTask = client.GetStreamAsync("https://api.os.uk/search/names/v1/find?query=coventry&fq=LOCAL_TYPE:Hospital");
var data = await JsonSerializer.DeserializeAsync<List<GAZETTEER_ENTRY>>(await streamTask);
foreach (var item in data)
Console.WriteLine(item.NAME1);
这是 JSON 数据:
"header" :
"uri" : "https://api.os.uk/search/names/v1/find?query=coventry",
"query" : "coventry",
"format" : "JSON",
"maxresults" : 100,
"offset" : 0,
"totalresults" : 4134
,
"results" : [
"GAZETTEER_ENTRY" :
"ID" : "osgb4000000074568994",
"NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000074568994",
"NAME1" : "Coventry",
"TYPE" : "populatedPlace",
"LOCAL_TYPE" : "City",
"COUNTRY" : "England",
,
"GAZETTEER_ENTRY" :
"ID" : "osgb4000000019401618",
"NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000019401618",
"NAME1" : "Coventry Street",
"TYPE" : "transportNetwork",
"LOCAL_TYPE" : "Named Road",
"COUNTRY" : "England",
,
"GAZETTEER_ENTRY" :
"ID" : "osgb4000000073321650",
"NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000073321650",
"NAME1" : "Coventry",
"TYPE" : "transportNetwork",
"LOCAL_TYPE" : "Railway Station",
"COUNTRY" : "England",
【问题讨论】:
【参考方案1】:尝试使用此 RootObject 模型反序列化 json:
public class RootObject
public ResultObject[] results get; set;
public class ResultObject
public GazetteerEntryObject GAZETTEER_ENTRY get; set;
public class GazetteerEntryObject
public string NAME1 get; set;
这样做
var data = await JsonSerializer.DeserializeAsync<RootObject>(await streamTask);
要检索名称,请执行以下操作:
var names = data.results.Select(x => x.GAZETTEER_ENTRY.NAME1);
【讨论】:
“名称”仍然为空【参考方案2】:你的响应类应该是这样的
public class SearchResult
public Header header get; set;
public List<Result> results get; set;
public class Header
public string uri get; set;
public string query get; set;
public string format get; set;
public int maxresults get; set;
public int offset get; set;
public int totalresults get; set;
public class Result
public GAZETTEER_ENTRY GAZETTEER_ENTRY get; set;
public class GAZETTEER_ENTRY
public string ID get; set;
public System.Uri NAMES_URI get; set;
public string NAME1 get; set;
public string TYPE get; set;
public string LOCAL_TYPE get; set;
public string COUNTRY get; set;
反序列化应该是
var data = await JsonSerializer.DeserializeAsync<SearchResult>(await streamTask);
并访问第 n 个结果的 NAME1
data.results[0].GAZETTEER_ENTRY.NAME1
如果您在比较类和 json 响应时发现困难,您可以简单地复制 json 响应并转到 VS -> 编辑-> 粘贴特殊 -> 将 json 粘贴为类。 VS 会自动为你生成类。
【讨论】:
谢谢。这个解决方案效果很好!以上是关于使用 DeserializineAsync (JSON/C#) 调用 Web API 以获取特定信息的主要内容,如果未能解决你的问题,请参考以下文章
使用 Vue.js 和 express.js 交付 Html 文件