我得到一个回复正文。正文的格式如下:
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值,有人可以提供帮助吗?
答案 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。请记住,实际分配某种类型会更好。