我希望有一個人可以幫助我。這是我用來通過 api(在本例中為 Twinkly 燈串)檢索有關特定設備的一堆資料的代碼。這是我的代碼,它部分功能。
HttpResponseMessage result = await httpClient.GetAsync(uri);
string response = await result.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(response);
Layout layout = new Layout();
layout = JsonConvert.DeserializeObject<Layout>(response);
我說它是“部分”功能的,因為根級別中的每個屬性都可以很好地反序列化到模型中,但是 json 還回傳一個名為“坐標”的屬性,它由每個燈泡的陣列條目組成,每個條目都有三個值對于 x,y,z。
我已經嘗試了很多東西來從坐標陣列中獲取資料,并且我可以打破模式查看資料在那里。

但是它沒有正確反序列化。我在坐標陣列中有正確數量的元素,但它們都是 x:0, y:0, z:0
這是我的模型架構。我希望有人能幫我解決這個問題。這是我第一次涉足 api 作業,也是我第一次擁有這樣的嵌套模型。
internal class Layout
{
public int aspectXY { get; set; }
public int aspectXZ { get; set; }
public LedPosition[] coordinates { get; set; }
public string source { get; set; } //linear, 2d, 3d
public bool synthesized { get; set; }
public string uuid { get; set; }
}
internal class LedPosition
{
double x { get; set; }
double y { get; set; }
double z { get; set; }
}
注意:我試過像這樣手動分配屬性:
JToken dataToken = jObject.GetValue("coordinates");
那確實收到了資料,但它對我沒有幫助,因為它只是解決了問題。
uj5u.com熱心網友回復:
你不需要同時決議和反序列化,這就足夠了
var response = await result.Content.ReadAsStringAsync();
var layout = JsonConvert.DeserializeObject<Layout>(response);
使 LedPosition 屬性可見 使它們也公開
public class LedPosition
{
public double x { get; set; }
public double y { get; set; }
public double z { get; set; }
}
因為它被另一個類使用,這個類也應該是公共的
public class Layout
uj5u.com熱心網友回復:
我最近從我作業的大狗 CTO 那里學到的一件事是,您實際上可以復制您期望的 JSON,然后轉到編輯 -> 選擇性粘貼 -> 在 Visual Studio 中將 JSON 粘貼為類,它會粘貼它作為您需要的類,具有正確的名稱/屬性。真的很滑 也許嘗試一下,看看它是否與您現在擁有的模型不同。
uj5u.com熱心網友回復:
這是我第一次涉足 api 作業
我想指出兩件事,然后..
- 您使用的 api 是否發布了 swagger/open api 檔案?
- 否 - 請參閱下面的 2
- 是的 - 看看 NSwag(Studio)、Autorest 等工具。您將 swagger.json 提供給它們,它們會生成幾千行代碼來創建一個客戶端,該客戶端執行所有 http 呼叫、反序列化、資料類等。如果這意味著您的代碼最終看起來像:
var client = new TwinklyLightClient();
var spec = client.GetTwinklyLightSpec();
foreach(var coord in spec.Coords)
Console.Write(spec.X);
這就是 API 應有的樣子;創建它們的工具按照規則運行,描述它們的工具按照規則運行,因此它們的消耗可以通過按照規則運行的工具來完成 - 撰寫樣板 json 和 http 請求正文是計算機的一項作業,因為它是重復的并且始終遵循同樣的模式
- API 沒有發布我們可以用來讓計算機為我們撰寫無聊部分的規范。杜恩。好吧,您可以自己制定規范(不是那么難),也可以稍微手動一點
- 獲取您的 json(查看原始資料并復制它)
- 轉到將 json 轉換為代碼的眾多網站中的任何一個 - 我喜歡http://QuickType.io,因為它支持多種語言,具有大量自定義功能并提供自定義型別 deser 的高級示例,但還有其他一些- 并將該 json 粘貼到
- 立即將其轉換為例如 C# 并可以粘貼到您的專案中
- 它給出了一個如何在評論中使用它的例子 - 一個像這樣的單行:
var json = httpCallHereTo.GetTheResponseAsJsonString();
var twinklyLightSpec = TwinklyLightSpec.FromJson(json);
是的,visual studio 可以從 json 生成類,但它不是很復雜 - 它可以完成這項作業,但是這些將 json 轉換為 c# 的站點進一步允許您選擇陣列或串列,根物件的名稱,裝飾每個屬性使用 JsonProperty 屬性指定 json 名稱并將 c# 屬性保留為 c# 命名約定(或允許您重命名它以適合您)。
..他們開箱即用,這將解決您現在遇到的這個問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394284.html
