使用 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(局部引用,全局引用)

使用域名访问不到js文件,使用ip可以

Mock.js使用

使用 Vue.js 和 express.js 交付 Html 文件

如何将 Angular JS 与 Leaflet.js 一起使用

如何使用 Express JS/Railway JS (Node.JS) 生成 JSON