亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解析嵌套的 json 文件

解析嵌套的 json 文件

Go
暮色呼如 2023-06-12 15:39:36
我正在解析一個結構不尋常的 JSON 文件,如下所示:{    "394885":     {        "record":         {            "student_name": "Daryl Jones",            "student_number": 123884,            "student_dob": "12/10/1982",            "student_email": "[email protected]",        }        },}我一直在研究一些代碼演示,但我想將其全部放入一個結構中,然后我計劃通過我猜是對象名稱的數字字符串來搜索它?我不擅長 JSON 或 Go,這是我到目前為止編寫的代碼:package mainimport (    "encoding/json"    "fmt"    "io/ioutil"    "os")type id struct {    recordid string    record   []record}type record struct {    name   string    number uint32    dob    string    email  string}func main() {    jsonFile, err := os.Open("/home/emyrw/development/go/src/json_processor/demo.json")    if err != nil {        fmt.Println(err)    } else {        var records id        byteValue, _ := ioutil.ReadAll(jsonFile)        json.Unmarshal(byteValue, &records)        fmt.Println(records)        fmt.Println("opened demo.json")        defer jsonFile.Close()    }}我不確定我是否做對了,但會重視任何人必須提供的任何提示或建議。我一直在谷歌搜索,但我發現沒有一個樣本非常適合我的場景。
查看完整描述

4 回答

?
慕蓋茨4494581

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)

在操場上運行它。



查看完整回答
反對 回復 2023-06-12
?
翻過高山走不出你

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第三,您在打開文件后立即放置語句,將其放在塊的末尾會破壞目的。


查看完整回答
反對 回復 2023-06-12
?
不負相思意

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())

? ? }

}


查看完整回答
反對 回復 2023-06-12
?
慕哥6287543

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 規范中是不允許的


查看完整回答
反對 回復 2023-06-12
  • 4 回答
  • 0 關注
  • 262 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號