我正在嘗試撰寫一個程式來進行 API 呼叫,然后將回傳的專案轉換為適合我的模型的物件,但未能成功。具體來說,我不能讓它去現實化,我懷疑它與我的模型相比如何回傳 json 有關。
我試圖獲取的資料如下所示; https://api.nasa.gov/planetary/apod?start_date=2022-03-01&end_date=2022-03-08&api_key=DEMO_KEY
如您所見,它由一組項組成,但陣列項沒有名稱。當我將它粘貼到帶有將 JSON 粘貼為類的 Get-model 中時,我得到了這個;
public class GetApodItemsResult
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public string copyright { get; set; }
public string date { get; set; }
public string explanation { get; set; }
public string hdurl { get; set; }
public string media_type { get; set; }
public string service_version { get; set; }
public string title { get; set; }
public string url { get; set; }
}
在我需要用這一行序列化 JSON 之前,我的整個代碼都可以正常作業:
var responseObject = await response.Content.ReadFromJsonAsync<GetApodItemsResult>();
,我從哪里得到這個訊息; System.Text.Json.JsonException:'JSON 值無法轉換為 UnnamedSpaceProject.Models.GetApodItemsResult。
有趣的是,我知道代碼在 spotify api 呼叫上作業,所以代碼實際上應該在很大程度上相同,這讓我相信問題在于 JSON 的格式。我該如何解決?因為我看不到讓根物件包含未命名陣列的方法。
uj5u.com熱心網友回復:
您的 JSON 包含的物件不是包含陣列的容器,而是陣列。所以,正確的代碼應該是這樣的:
var responseObject = await response.Content.ReadFromJsonAsync<Class1[]>();
您的代碼的正確 JSON如下所示:
{
"Property1": [{
"copyright": "Jeff DaiTWAN",
"date": "2022-03-01",
"url": "https://apod.nasa.gov/apod/image/2203/DuelingBands_Dai_960.jpg"
}]
}
uj5u.com熱心網友回復:
您的GetApodItemsResult類不是反序列化從服務器獲得的內容的有效類,正確的反序列化型別將是List<Class1>或Class1[]
var responseObject = await response.Content.ReadFromJsonAsync<List<Class1>>();
我建議您使用更有意義的名稱而不是Class1您可以命名它Apod(Astronomy Picture of the Day 的首字母縮寫)
完整的作業代碼:
using System.Text.Json;
using System.Text.Json.Serialization;
HttpClient client = new HttpClient();
const string BaseUrl = @"https://api.nasa.gov/";
var response = await client.GetAsync($"{BaseUrl}planetary/apod?start_date=2022-03-01&end_date=2022-03-08&api_key=DEMO_KEY");
if ((response.StatusCode != System.Net.HttpStatusCode.OK))
{
Console.Error.WriteLine("field to fetch data from server");
}
var responseBody = await response.Content.ReadAsStringAsync();
var pictuersList = JsonSerializer.Deserialize<List<Apod>>(responseBody);
Console.WriteLine($"there is {pictuersList?.Count} apod downloaded successflly");
Console.WriteLine("done");
public class Apod
{
[JsonPropertyName("copyright")]
public string Copyright { get; set; } = "";
[JsonPropertyName("date")]
public string Date { get; set; } = "";
[JsonPropertyName("explanation")]
public string Explanation { get; set; } = "";
[JsonPropertyName("hdurl")]
public string Hdurl { get; set; } = "";
[JsonPropertyName("media_type")]
public string MediaType { get; set; } = "";
[JsonPropertyName("service_version")]
public string ServiceVersion { get; set; } = "";
[JsonPropertyName("title")]
public string Title { get; set; } = "";
[JsonPropertyName("url")]
public string Url { get; set; } = "";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452084.html
