Json decode/unmarshal 在 golang 中
Json decode/unmarshal in golang
我有以下 json:
{"results":
[{"columns":["room_id","player_name","player_ip"],
"types":["integer","text","text"],
"values":[[1,"alice","127.0.0.1"]
[1,"bob","127.0.0.1"]],
"time":0.00018839100000000002}]}
其中值可以包含任意数量的元素 []。当我尝试将 json 解组为结构时,"values" 标记未正确解析
结构:
type queryResults struct {
Results []struct {
Columns []string `json:"columns"`
Types []string `json:"types"`
Values []struct {
Room_id int
Player_name string
Player_ip string
} `json:"values"`
Time float64 `json:"time"`
} `json:"results"`
}
代码:
//jsonString is the string input to Unmarshal
resultjson := queryResults{}
json.Unmarshal([]byte(jsonString), &resultjson)
fmt.Printf("%+v",resultjson)
当前输出:
{Results:
[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[{room_id:0 player_name: player_ip:}
{room_id:0 player_name: player_ip:}]
Time:0.00018839100000000002}]}
预期输出:
{Results:
[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[{room_id:1 player_name:alice player_ip:127.0.0.1}
{room_id:1 player_name:bob player_ip:127.0.0.1}]
Time:0.00018839100000000002}]}
问题是您的结构定义期望 "values" 包含一个对象数组,但您的实际 json 包含一个数组数组。如果您检查 json.Unmarshal() 的结果,您会看到它报告有关此的错误。试试 golang playground
error json: cannot unmarshal array into Go value of type struct { Room_id int; Player_name string; Player_ip string }
据我所知,您无法将其直接映射到结构中,您需要将其读入数组,然后 post 将其处理为您的最终类型。这是成功解析 json 的 example [post 解析转换留作 reader]
的练习
{Results:[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[[1 alice 127.0.0.1] [1 bob 127.0.0.1]]
Time:0.00018839100000000002}]}
Json 数组应解组为 Go 切片或数组。看起来您正在尝试将 values
中的数组解组为 struct
"values": [[1,"alice","127.0.0.1"], [1,"bob","127.0.0.1"]]
上面的数组数组应该被解组为一个 Go 切片切片。
尝试,
type queryResults struct {
Results []struct {
Columns []string `json:"columns"`
Types []string `json:"types"`
Values [][]interface{} `json:"values"`
Time float64 `json:"time"`
} `json:"results"`
}
并且不要忽略错误。如果你尝试过,
err := json.Unmarshal([]byte(jsonString), &resultjson)
if(err != nil){
fmt.Println(err)
}
您可能已经看到了错误。
我有以下 json:
{"results":
[{"columns":["room_id","player_name","player_ip"],
"types":["integer","text","text"],
"values":[[1,"alice","127.0.0.1"]
[1,"bob","127.0.0.1"]],
"time":0.00018839100000000002}]}
其中值可以包含任意数量的元素 []。当我尝试将 json 解组为结构时,"values" 标记未正确解析
结构:
type queryResults struct {
Results []struct {
Columns []string `json:"columns"`
Types []string `json:"types"`
Values []struct {
Room_id int
Player_name string
Player_ip string
} `json:"values"`
Time float64 `json:"time"`
} `json:"results"`
}
代码:
//jsonString is the string input to Unmarshal
resultjson := queryResults{}
json.Unmarshal([]byte(jsonString), &resultjson)
fmt.Printf("%+v",resultjson)
当前输出:
{Results:
[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[{room_id:0 player_name: player_ip:}
{room_id:0 player_name: player_ip:}]
Time:0.00018839100000000002}]}
预期输出:
{Results:
[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[{room_id:1 player_name:alice player_ip:127.0.0.1}
{room_id:1 player_name:bob player_ip:127.0.0.1}]
Time:0.00018839100000000002}]}
问题是您的结构定义期望 "values" 包含一个对象数组,但您的实际 json 包含一个数组数组。如果您检查 json.Unmarshal() 的结果,您会看到它报告有关此的错误。试试 golang playground
error json: cannot unmarshal array into Go value of type struct { Room_id int; Player_name string; Player_ip string }
据我所知,您无法将其直接映射到结构中,您需要将其读入数组,然后 post 将其处理为您的最终类型。这是成功解析 json 的 example [post 解析转换留作 reader]
的练习{Results:[{Columns:[room_id player_name player_ip]
Types:[integer text text]
Values:[[1 alice 127.0.0.1] [1 bob 127.0.0.1]]
Time:0.00018839100000000002}]}
Json 数组应解组为 Go 切片或数组。看起来您正在尝试将 values
中的数组解组为 struct
"values": [[1,"alice","127.0.0.1"], [1,"bob","127.0.0.1"]]
上面的数组数组应该被解组为一个 Go 切片切片。
尝试,
type queryResults struct {
Results []struct {
Columns []string `json:"columns"`
Types []string `json:"types"`
Values [][]interface{} `json:"values"`
Time float64 `json:"time"`
} `json:"results"`
}
并且不要忽略错误。如果你尝试过,
err := json.Unmarshal([]byte(jsonString), &resultjson)
if(err != nil){
fmt.Println(err)
}
您可能已经看到了错误。