【问题标题】:Golang decoding JSON into slice with one string and one float64Golang 将 JSON 解码为一个字符串和一个 float64 的切片
【发布时间】:2018-05-04 16:18:30
【问题描述】:

我正在对服务器上的数据库运行查询。问题是当我尝试将 JSON 解码为 2D 切片时出现错误,因为其中一个元素是字符串,另一个元素是 float64。

我尝试解决此问题的一种方法是在解码之前修改 JSON 字符串,方法是添加引号以使数字成为字符串。但是有没有更好的方法来做到这一点?有没有办法可以修改我能够解码 JSON 代码的代码结构?

2018/05/04 12:32:19 json:无法将数字解组到 Go struct 字段中。字符串类型的值

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])
        }
    }

【问题讨论】:

  • 编辑做一个最小的例子。更具体地说,将获取 JSON 文本的代码替换为包含 JSON 文本的文字字符串。
  • 我更新了代码@ThunderCat 做一个最小的例子

标签: json go


【解决方案1】:

这是一个非常不幸的 API,必须使用,但有一个(有点笨拙的)解决方法:

Values [][]interface{} `json:"values"`

基本上这是在说“一系列未知类型的东西”。这将允许解码器正确解码,但需要您执行一些类型断言才能实际使用这些值,以便从“未知类型”获取您可以实际使用的已知类型:

strVal := m.Results[0].Series[0].Values[0][0].(string)
floatVal := m.Results[0].Series[0].Values[0][1].(float64)

可运行示例:https://play.golang.org/p/ikIHnXlSlYx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2019-03-28
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2022-09-22
    相关资源
    最近更新 更多