【问题标题】:How to parse JSON array in Go如何在 Go 中解析 JSON 数组
【发布时间】:2016-12-16 12:00:37
【问题描述】:

如何使用 json 包解析 Go 中的字符串(即数组)?

type JsonType struct{
    Array []string
}

func main(){
    dataJson = `["1","2","3"]`
    arr := JsonType{}
    unmarshaled := json.Unmarshal([]byte(dataJson), &arr.Array)
    log.Printf("Unmarshaled: %v", unmarshaled)
}

【问题讨论】:

    标签: arrays json go slice


    【解决方案1】:

    Unmarshalreturn valueerror,这就是您要打印的内容:

    // Return value type of Unmarshal is error.
    err := json.Unmarshal([]byte(dataJson), &arr)
    

    你也可以去掉JsonType,只使用一个切片:

    package main
    
    import (
        "encoding/json"
        "log"
    )
    
    func main() {
        dataJson := `["1","2","3"]`
        var arr []string
        _ = json.Unmarshal([]byte(dataJson), &arr)
        log.Printf("Unmarshaled: %v", arr)
    }
    
    // prints out:
    // 2009/11/10 23:00:00 Unmarshaled: [1 2 3]
    

    播放代码:https://play.golang.org/p/GNWlylavam

    背景:传入指针允许Unmarshal 减少(或完全摆脱)内存分配。此外,在处理上下文中,调用者可能会重复使用相同的值来重复保存分配。

    【讨论】:

      【解决方案2】:

      注意:此答案是在编辑问题之前编写的。在original question&arr被传递给json.Unmarshal()

      unmarshaled := json.Unmarshal([]byte(dataJson), &arr)
      

      您将arr 的地址传递给json.Unmarshal() 以解组JSON 数组,但arr 不是数组(或切片),它是一个结构值。

      数组可以解组为 Go 数组或切片。所以通过arr.Array:

      dataJson := `["1","2","3"]`
      arr := JsonType{}
      err := json.Unmarshal([]byte(dataJson), &arr.Array)
      log.Printf("Unmarshaled: %v, error: %v", arr.Array, err)
      

      输出(在Go Playground上试试):

      2009/11/10 23:00:00 Unmarshaled: [1 2 3], error: <nil>
      

      当然你甚至不需要JsonType 包装器,只需使用一个简单的[]string 切片:

      dataJson := `["1","2","3"]`
      var s []string
      err := json.Unmarshal([]byte(dataJson), &s)
      

      【讨论】:

      • 忘记传地址了,还以为是返回了解析后的数组,所以结果为什么是,因为是错误的值,真丢人。
      • @kingSlayer 您必须传递变量的地址,以便json 包可以直接解组到您的变量中。结果不需要返回,但可选的错误必须是。
      • 所以我的问题是我打印出错误的值而不是 arr.Array 的指向值,这对我来说很困惑,谢谢。
      • @kingSlayer 是的,您编辑了您的问题,但在您的original question 中您传递了arr,这会导致错误。
      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2014-09-20
      • 1970-01-01
      • 2015-06-07
      • 2021-03-09
      相关资源
      最近更新 更多