如何在golang中将http响应主体解析为json格式?

时间:2019-10-17 13:36:31

标签: json go

我得到一个回复​​正文。正文的格式如下:

PERSON_NUMBER   EMPL_ID
ID1             ABC1
ID1             ABC1
ID2             ABC2
ID2             ABC2
ID3             ABC3
ID3             ABC4

我想将正文解析为json结构,我的代码如下:

  [
    {
       "id":1,
       "name":"111" 
    },
    {
       "id":2,
       "name":"222" 
    }
  ]

总是出现错误:无法将数组解组为xxx类型的Go值,有人可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

您的数据采用数组形式,因为其开始和结束都带有方括号:

[{"id":1, "name":"111"}, {"id":2, "name":"222"}]

因此,您需要切片Info才能解组([]Info)。
请注意,您应在json:"id"之类的反引号内的JSON标记中添加双引号。

尝试this个工作示例:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

func main() {
    var v []Info
    if err := json.Unmarshal(data, &v); err != nil {
        log.Fatalf("Parse response failed, reason: %v \n", err)
    }
    fmt.Println(v)
}

// Info is ID Name
type Info struct {
    ID   uint32 `json:"id"`
    Name string `json:"name"`
}

// Response is a slice of Info
type Response struct {
    infos []Info
}

var data = []byte(`[
    {
       "id":1,
       "name":"111" 
    },
    {
       "id":2,
       "name":"222" 
    }
  ]`)

输出:

[{1 111} {2 222}]

如果您想使用v := &Response{},则需要使用&v.infos,例如:json.Unmarshal(data, &v.infos)

请参阅: Go by Example: JSON

Docs

  

要将JSON数组解组到切片中,Unmarshal会将切片长度重置为零,然后将每个元素附加到切片中。作为一种特殊情况,为了将一个空的JSON数组解组为切片,Unmarshal将该切片替换为一个新的空切片。

     

要将JSON数组解组为Go数组,Unmarshal会将JSON数组元素解码为相应的Go数组元素。如果Go数组小于JSON数组,则其他JSON数组元素将被丢弃。如果JSON数组小于Go数组,则将其他Go数组元素设置为零值。

try和打包文档中的示例:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var jsonBlob = []byte(`[
    {"Name": "Platypus", "Order": "Monotremata"},
    {"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`)
    type Animal struct {
        Name  string
        Order string
    }
    var animals []Animal
    err := json.Unmarshal(jsonBlob, &animals)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", animals)
}

答案 1 :(得分:1)

我实际上在搜寻入门级Go问题时偶然发现了这个问题,所以我想留言:

package main

import (
        "encoding/json"
        "fmt"
        "net/http"
)

func main() {
        url := "https://skishore.github.com/inkstone/all.json"

        resp, err := http.Get(url)
        if err != nil {
                panic(err)
        }
        defer resp.Body.Close()

        var j interface{}
        err = json.NewDecoder(resp.Body).Decode(&j)
        if err != nil {
                panic(err)
        }
        fmt.Printf("%s", j)
}

这将下载一个示例JSON url,在不事先知道其内容的情况下对其进行解码,并打印到stdout。请记住,实际分配某种类型会更好。