我正在对服务器上的数据库运行查询。问题是当我试图将JSON解码为2D切片时,我得到一个错误,因为其中一个元素是一个字符串而另一个元素是一个float64。
我尝试解决此问题的一种方法是在解码之前修改JSON字符串,方法是添加引号以使数字成为字符串。但有更好的方法吗?有没有办法可以修改我能够解码JSON代码的代码结构?
2018/05/04 12:32:19 json:无法将数字解组为Go struct field。值类型为字符串
import (
"fmt"
"encoding/json"
"strings"
"io"
"log"
)
func main(){
str := "{\"results\":[{\"statement_id\":0,\"series\":[{\"name\":\"_\",\"columns\":[\"time\",\"last\"],\"values\":[[\"2018-03-20T18:45:57.07Z\",142774272]]}]}]}"
type Response struct {
Results []struct {
StatementID int `json:"statement_id"`
Series []struct {
Name string `json:"name"`
Columns []string `json:"columns"`
Values [][]string `json:"values"`
} `json:"series"`
} `json:"results"`
}
dec := json.NewDecoder(strings.NewReader(str))
for {
var m Response
if err := dec.Decode(&m); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
fmt.Println(m.Results[0].Series[0].Values[0])
}
}
答案 0 :(得分:2)
这是一个非常不幸的API必须使用,但有一个(有点笨拙)的解决方法:
Values [][]interface{} `json:"values"`
基本上这是说"一系列未知类型的东西"。这将允许解码器正确解码,但它需要你做一些类型的断言来实际使用这些值,以便从#34;未知类型"到您可以实际使用的已知类型:
strVal := m.Results[0].Series[0].Values[0][0].(string)
floatVal := m.Results[0].Series[0].Values[0][1].(float64)