我正在嘗試呼叫 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",
}
uj5u.com熱心網友回復:
你的回應類應該像
public class SearchResult
{
public Header header { get; set; }
public 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 string 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 會自動為你生成類。
uj5u.com熱心網友回復:
嘗試使用此 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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340347.html
