簡體   English   中英

Golang json.Unmarshal 未按預期工作

[英]Golang json.Unmarshal is not working as expected

我正在嘗試解組來自 vcenter rest api 的 json 響應。當響應正文被簡單打印時,它看起來像下面的 o/p

{"value":[{"memory_size_MiB":16384,"vm":"vm-10236","name":"Normal_Windows_192.168.1.10","power_state":"POWERED_OFF","cpu_count":8},{"memory_size_MiB":8192,"vm":"vm-10238","name":"Normal_Windows_192.168.1.11","power_state":"POWERED_OFF","cpu_count":4}]}

我已經導出了結構和結構字段,但是像 memory_size_MiB、power_state、cpu_count 這樣的字段沒有被解組。 打印結構時,它如下所示:-

{Value:[{Mem:0 Vm:vm-10236 Name:Normal_Windows_192.168.1.10 Powerstat: Cpu:0} {Mem:0 Vm:vm-10238 Name:Normal_Windows_192.168.1.11 Powerstat: Cpu:0} {Mem:0 Vm:vm-10582 Name:Normal_Windows_192.168.1.12 Powerstat: Cpu:0}]}% 

下面是我的 main.go

    package main
    
    import (
...
    )
    type SessionData struct {
        VmwareApiSessionId string `json:"value"`
    }
    //{"memory_size_MiB":16384,"vm":"vm-10236","name":"Normal_Windows_192.168.19.100","power_state":"POWERED_OFF","cpu_count":8}
    type Vm struct {
        Mem int `json: "memory_size_MiB"`
        Vm string `json: "vm"`
        Name string `json: "name"`
        Powerstat string `json: "power_state"`
        Cpu int `json: "cpu_count"`
    }
    //{Value:[{Mem:0 Vm:vm-10236 Name:Normal_Windows_192.168.1.10 Powerstat: Cpu:0} {Mem:0 Vm:vm-10238 Name:Normal_Windows_192.168.1.11 Powerstat: Cpu:0} {Mem:0 Vm:vm-10582 Name:Normal_Windows_192.168.1.12 Powerstat: Cpu:0}]}
    type ColVmList struct {
        Value []Vm `json: "value"`
    }
    func getVmList(sessid string,cli *http.Client) ColVmList {
        vms := ColVmList{}
        req,err:=http.NewRequest("GET","https://sandbox.vmware.local/rest/vcenter/vm",nil)
        req.Header.Add("vmware-api-session-id",sessid)
        resp,err := cli.Do(req)
        if err != nil {
            log.Fatal("Error %s", err)
        }
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
        err = json.Unmarshal([]byte(body),&vms)
        if err != nil {
            log.Fatal("error %s", err)
        }
        return vms
    }
    
    func main(){
    //authpart
    loginurl = "https://sandbox.vmware.local/rest/com/vmware/cis/session"
    //login...
    err = json.Unmarshal([]byte(string(body)),&sessVal)
    if  err != nil{
        log.Fatal(err)
    }
    var allvmlist ColVmList
    allvmlist = getVmList(sessVal.VmwareApiSessionId,&cli)
    fmt.Printf("%v",allvmlist)
    }

您的結構標簽格式不正確。 刪除json:和結構標簽中的字符串"..."之間的空格。 即它必須是json:"..."而不是json: "..."

某些字段即使使用格式不正確的結構標記也能正確解組的原因是因為字段的名稱與 json 屬性名稱相匹配。

func main() {
    data := []byte(`{"memory_size_MiB":16384}`)

    var obj1 struct {
        Mem int `json: "memory_size_MiB"`
    }
    if err := json.Unmarshal(data, &obj1); err != nil {
        panic(err)
    }
    fmt.Println(obj1)

    var obj2 struct {
        Mem int `json:"memory_size_MiB"`
    }
    if err := json.Unmarshal(data, &obj2); err != nil {
        panic(err)
    }
    fmt.Println(obj2)
}

https://go.dev/play/p/gUR5ed2n0D1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM