我正在尝试将此json格式的字符串转换为GOLANG中的实际json对象。
{"predictions": [{"predictions": [4492.0]}, {"predictions": [4515.84716796875]}, {"predictions": [4464.86083984375]}]}
基本上,这是一个具有键“ predictions”的字典,其值是一个字典数组(每个字典具有键“ predictions”和一个值是1元素的float数组。我创建了两个结构(一个对于第一个字典,对另一个字典则是字典数组),但是我无法将字符串json放入我的结构中。我不确定要丢失什么
package main
import (
"encoding/json"
"fmt"
)
type dataPredictions struct {
SinglePredictions *SinglePredictions `json:"predictions"`
}
type SinglePredictions struct {
Predictions []map[string]int `json:predictions`
}
func main() {
s := `{"predictions": [{"predictions": [4492.0]}, {"predictions": [4515.84716796875]}, {"predictions": [4464.86083984375]}]}`
data := &dataPredictions{
SinglePredictions: &SinglePredictions{},
}
err := json.Unmarshal([]byte(s), data)
s2, _ := json.Marshal(data)
fmt.Println(err)
fmt.Println(data.SinglePredictions)
fmt.Println(string(s2))
}
我得到的错误如下。
json: cannot unmarshal array into Go struct field dataPredictions.predictions of type main.SinglePredictions
答案 0 :(得分:1)
基本上有两个错误。首先是您没有将SinglePredictions定义为切片,这就是为什么首先出现错误的原因,然后在只需要向下传递[]float64
时就使用了地图。
package main
import (
"encoding/json"
"fmt"
)
type dataPredictions struct {
SinglePredictions []*SinglePredictions `json:"predictions"`
}
type SinglePredictions struct {
Predictions []float64 `json:"predictions"`
}
func main() {
s := `{"predictions": [{"predictions": [4492.0]}, {"predictions": [4515.84716796875]}, {"predictions": [4464.86083984375]}]}`
// Note that you don't need to assign values manually - json.Unmarshal
// will do that for you.
data := &dataPredictions{}
err := json.Unmarshal([]byte(s), data)
s2, _ := json.Marshal(data)
fmt.Println(err)
fmt.Println(data.SinglePredictions)
fmt.Println(string(s2))
}
您犯的错误似乎是一直在考虑Go会将第一个数组解组到dataPredictions.SinglePredictions.Predictions
中。但是在dataPredictions
中,您有一个字段可以选择最上方对象中的"predictions"
键,然后将其值传递给解编为*SinglePredictions
答案 1 :(得分:1)
尝试一下:
package main
import (
"encoding/json"
"fmt"
)
type dataPredictions struct {
SinglePredictions []SinglePredictions `json:"predictions"`
}
type SinglePredictions struct {
Predictions []float64 `json:"predictions"`
}
func main() {
s := []byte(`{"predictions": [{"predictions": [4492.0]}, {"predictions": [4515.84716796875]}, {"predictions": [4464.86083984375]}]}`)
data := dataPredictions{}
err := json.Unmarshal(s, &data)
s2, _ := json.Marshal(data)
fmt.Println(err)
fmt.Println(data.SinglePredictions)
fmt.Println(string(s2))
}