将字符串(地图数组)转换为golang中的json对象

时间:2018-06-20 18:47:47

标签: json api go

我正在尝试将此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

2 个答案:

答案 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))
}