dongqi1245 2018-08-06 09:50
浏览 60
已采纳

解码字符串和整数的切片

How do you decode a slice of strings and integers which don't have field names?

This is the output from the remote API I am trying to decode:

[["9BC67ACD", "example1", "example1.co.uk", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "FINISHED", 1], ["B339CBA2", "example2", "example2.co.uk", "2018-08-06 08:38:25", "2018-08-06 08:38:24", "2018-08-06 08:38:27", "FINISHED", 1]]

I get this as a slice of bytes after doing

rBody, err := ioutil.ReadAll(r.Body)

Can I decode this using the json decoder with [][]interface{}?

  • 写回答

1条回答 默认 最新

  • douwei2825 2018-08-06 09:55
    关注

    For your question:-

    Can I decode this using the json decoder with [][]interface{}

    Yes you can there is nothing wrong with decoding the JSON output. This is an array of JSON.

    [["9BC67ACD", "example1", "example1.co.uk", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "FINISHED", 1], ["B339CBA2", "example2", "example2.co.uk", "2018-08-06 08:38:25", "2018-08-06 08:38:24", "2018-08-06 08:38:27", "FINISHED", 1]]
    

    Or you can Unmarshal the JSON into an interface{}. But in both cases you need type assertion to fetch the underlying value of an interface.

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    var jsonBytes string = `[["9BC67ACD", "example1", "example1.co.uk", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "FINISHED", 1], ["B339CBA2", "example2", "example2.co.uk", "2018-08-06 08:38:25", "2018-08-06 08:38:24", "2018-08-06 08:38:27", "FINISHED", 1]]`
    
    func main() {
        var result interface{}
        if err := json.Unmarshal([]byte(jsonBytes), &result); err != nil{
            fmt.Println(err)
        }
        fetchValue(result) // This function recursively get the underlying value of an interface.
    }
    
    func fetchValue(value interface{}) {
        switch value.(type) {
        case string:
            fmt.Printf("%v is an string 
     ", value.(string))
        case bool:
            fmt.Printf("%v is bool 
     ", value.(bool))
        case float64:
            fmt.Printf("%v is float64 
     ", value.(float64))
        case []interface{}:
            fmt.Printf("%v is a slice of interface 
     ", value)
            for _, v := range value.([]interface{}) {
                fetchValue(v)
            }
        case map[string]interface{}:
            fmt.Printf("%v is a map 
     ", value)
            for _, v := range value.(map[string]interface{}) {
                fetchValue(v)
            }
        default:
            fmt.Printf("%v is unknown 
     ", value)
        }
    }
    

    Playground example

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境