【问题标题】:How to unmarshal a json array with different type of value in it如何解组具有不同类型值的json数组
【发布时间】:2014-08-15 12:45:44
【问题描述】:

例如:

{["NewYork",123]}

对于json数组被解码为go数组,而go数组需要显式定义一个类型, 不知道怎么处理。

【问题讨论】:

    标签: json go


    【解决方案1】:

    首先,json 是无效的,对象必须有键,所以它应该是 {"key":["NewYork",123]} 或只是 ["NewYork",123]

    当您处理多种随机类型时,您只需使用interface{}

    const j = `{"NYC": ["NewYork",123]}`
    
    type UntypedJson map[string][]interface{}
    
    func main() {
        ut := UntypedJson{}
        fmt.Println(json.Unmarshal([]byte(j), &ut))
        fmt.Printf("%#v", ut)
    }
    

    playground

    【讨论】:

      【解决方案2】:

      json 包使用 map[string]interface{} 和 []interface{} 值来存储任意 JSON 对象和数组... http://blog.golang.org/json-and-go

      对象中的每个值都必须有键。所以假设这是你的 json :

      {"key":["NewYork",123]}
      

      那么你的代码应该是这样的:

      package main
      
      import (
          "encoding/json"
          "fmt"
      )
      
      type Message map[string]interface{}
      
      func main() {
          msg := Message{}
          s := `{"key":["Newyork",123]}`
          err := json.Unmarshal([]byte(s), &msg)
          fmt.Println(msg, err)
      }
      

      你可以运行它:http://play.golang.org/p/yihj6BZHBY

      【讨论】:

      • 对于特定情况map[string][]interface{} 更好,因为他总是期待一个数组。
      • 我刚刚关注了这里:blog.golang.org/json-and-go。但是,对于这种情况,您提供的内容也是明智的。
      • map[string]interface{} 如果您希望该值是 null 或数组之外的其他值,则非常好。
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多