4 回答

TA貢獻1850條經驗 獲得超11個贊
聲明匹配數據結構的 Go 類型。JSON 數據具有三個級別的對象。使用映射來表示 JSON 中的頂級對象,因為頂級對象具有任意鍵。將結構用于 JSON 中的低級別對象。
使用 JSON 字段標簽將 JSON 中使用的 snake case 名稱映射到更慣用的 Go 名稱。?導出字段,以便 JSON 包可以訪問它們。
type Record struct {
? ? Name? ?string `json:"student_name"`
? ? Number uint32 `json:"student_number"`
? ? DOB? ? string `json:"student_dob"`
? ? Email? string `json:"student_email"`
}
type ID struct {
? ? Record Record
}
...
var records map[string]ID
err := json.Unmarshal(jsonFile, &records)
if err != nil {
? ? log.Fatal(err)
}
fmt.Printf("%#v\n", records)

TA貢獻1875條經驗 獲得超3個贊
首先,您的 JSON 無效。與 GoLang 結構不同,您不需要,在最終對象之后放置。
{ “394885”:{ “記錄”:{ “student_name”:“Daryl Jones”,“student_number”:123884,“student_dob”:“12/10/1982”,“student_email”:“[email protected] “ }
} }
其次, var records應該通過完全按照 JSON 對象中命名的方式命名結構中的字段,或者使用屬性來準確地對 JSON 建模。
你的 JSON 的外部不是 type id,它是 typemap[string]id
id沒有recordid字段,但是它有一個record字段,但是,如果要將 JSON 序列化到結構中,則必須導出結構的字段(以大寫字母開頭)。
這是屬性派上用場的地方,
type id struct {
Record []record `json:"record"`
}
與record結構相同,
type record struct {
Name string `json:"student_name"`
Email string `json:"student_email"`
// You get the idea...
}
defer第三,您在打開文件后立即放置語句,將其放在塊的末尾會破壞目的。

TA貢獻1777條經驗 獲得超10個贊
jsonquery包可以輕松地從 JSON 文檔中提取數據,并且它不依賴于定義的結構對象。
func main() {
? ? s := `{
? ? ? ? "394885":?
? ? ? ? {
? ? ? ? ? ? "record":?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "student_name": "Daryl Jones",
? ? ? ? ? ? ? ? "student_number": 123884,
? ? ? ? ? ? ? ? "student_dob": "12/10/1982",
? ? ? ? ? ? ? ? "student_email": "[email protected]"
? ? ? ? ? ? }? ??
? ? ? ? }
? ? }`
? ? doc, err := jsonquery.Parse(strings.NewReader(s))
? ? if err != nil {
? ? ? ? panic(err)
? ? }
? ? nodes := jsonquery.Find(doc, "*")
? ? for _, n := range nodes {
? ? ? ? fmt.Printf("id: %s \n", n.Data)
? ? ? ? name := jsonquery.FindOne(n, "http://student_name") // Find student name node
? ? ? ? fmt.Printf("student name: %s\n", name.InnerText())
? ? ? ? number := jsonquery.FindOne(n, "http://student_number") // Find node for student number
? ? ? ? fmt.Printf("student number: %s\n", number.InnerText())
? ? }
}

TA貢獻1831條經驗 獲得超10個贊
您可以將此結構用于您的 id 類型
type id struct {
record map[string]record
}
編輯
這是帶有一些解釋的工作解決方案:
由于您有一個多級 json,您可以將其解析為嵌套結構。
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "[email protected]"
}
要解析 json 的這一部分,你需要這個結構
type record struct {
Name string `json:"student_name"`
Number uint32 `json:"student_number"`
Dob string `json:"student_dob"`
Email string `json:"student_email"`
}
必須導出字段(以大寫字母開頭)并具有與 json 屬性匹配的 json 標記。
{
"record":
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "[email protected]"
}
}
為了讓這部分工作,你需要一個像這樣的嵌套結構
type id struct {
Record record
}
文件名再次導出,但由于它與您的 json 屬性匹配,因此您不需要標簽。
{
"394885":
{
"record":
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "[email protected]"
}
}
}
由于頂級屬性名稱是學生 ID,因此您可以使用映射而不是結構
var records map[string]id
并確保你沒有尾隨逗號,因為這在 json 規范中是不允許的
- 4 回答
- 0 關注
- 262 瀏覽
添加回答
舉報