我是一位經驗豐富的 C# 軟體工程師。我已經閱讀了檔案并瀏覽了博客。我懷疑答案是“不,C# 不支持”,但值得在這里問一下:
假設我有這樣的 JSON 資料描述:
{
"data": {
"name": {
"first_name": "Fred",
"last_name": Smith,
},
"address": {
"street": "123 Main Street",
"city": "Anytown",
"state": "CA"
}
}
JSON 使得創建深度嵌套的資料結構變得非常容易。但是為了在 C# 中表示相同的資料結構,我顯然需要為每個嵌套結構定義一個單獨的類,如下所示:
private class Data {
public Name name { get; set; }
public Address address { get; set; }
}
private class name {
public string first_name { get; set; }
public string last_name { get; set; }
}
private class Address {
public string street { get; set; }
public string city { get; set; }
public string state { get; set; }
}
有什么方法可以簡化此代碼以接近 JSON 表示的簡單性?
uj5u.com熱心網友回復:
你混淆了兩個不同的概念。您包含的 JSON 正在定義object。使用匿名型別的 C# 等效項可能如下所示:
new
{
data = new
{
name = new
{
first_name = "Fred",
last_name = "Smith"
},
address = new
{
street = "123 Main Street",
city = "Anytown",
state = "CA"
}
}
}
您發布的 C# 代碼定義了型別。由于 JavaScript 還沒有型別,因此必須使用 TypeScript 之類的語言來完成類似的操作。TypeScript 看起來像這樣:
type response = {
data: {
name: {
first_name: string,
last_name: string
},
address: {
street: string,
city: string,
state: string
}
}
}
沒有像這樣宣告嵌套 C# 型別的簡單語法。您可以宣告嵌套在其他類中的 C# 類,但這不允許您像 TypeScript 那樣宣告與屬性名稱行內的型別。
如果您嘗試在 C# 中使用JSON,并且不關心像上面的 C# 代碼那樣創建強型別,則可以完全避免創建型別:只需將 JSON 反序列化為一個dynamic型別,或者使用類似的型別JToken并使用字串。(有關如何執行此操作的詳細資訊將取決于您的序列化框架。)
uj5u.com熱心網友回復:
例如,如果這些類非常依賴于彼此,name并且addresss在外部沒有意義data,則可以在內部將它們定義data為嵌套類。您不保存代碼,但它更加封裝。
在這種情況下,您可以這樣做:
private class Data
{
public Name name { get; set; }
public Address address { get; set; }
#region Nested classes
public class Name
{
public string first_name { get; set; }
public string last_name { get; set; }
}
public class Address
{
public string street { get; set; }
public string city { get; set; }
public string state { get; set; }
}
#endregion
}
使用該區域,您可以折疊該代碼并減少您的Data類的多載。
uj5u.com熱心網友回復:
如果您希望構建更易于閱讀的新型別,只需使用 notepadd 之類的東西并首先創建一個 json 物件,然后使用轉換工具將其自動轉換為 c# 物件。
這是另一種方式:您可以做的是查看從 C# 生成 Avro Schema
如果您希望使流程自動化,您可以執行以下操作 https://www.thecodebuzz.com/generate-avro-schema-from-json/
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477180.html
