代码之家  ›  专栏  ›  技术社区  ›  drum

如何解组不同数据类型的json数组?

  •  -1
  • drum  · 技术社区  · 7 年前

    我试图解开的json的一部分有一个可以包含字符串或int的数组。我该如何分析这个?

    {
        "id": "abc",
        "values": [1,2,3]
    },
    {
        "id": "def",
        "values": ["elephant", "tomato", "arrow"]
    },
    {
        //etc...
    }
    

    我尝试了以下方法:

    type Thing struct {
        ID      string   `json:"id"`
        Values  []string `json:"values,string,omitempty"`
    }
    

    获取以下错误:

    panic: json: cannot unmarshal array into Go struct field Thing.values of type string
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   JOSE ENRIQUE NARVAEZ GAGO    7 年前

    可以将字段值的类型设置为[]interface{},但可能必须使用某些类型断言。

    这里是一个指向游乐场的链接,我在这里使用您提供的数据: https://play.golang.org/p/ahePgggr8o1

    我会把代码粘贴到这里:

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    type Thing struct {
        ID      string   `json:"id"`
        Values  []interface{} `json:"values,omitempty"`
    }
    
    func print(values []interface{}) {
        for _, v := range values{
            switch value := v.(type){
            case string:
                fmt.Println("String", value)
            case int:
                fmt.Println("Integer", value)
            case float64:
                fmt.Println("Floats", value)
            default:
                fmt.Printf("I don't know about type %T!\n", v)
            }
        }
    }
    
    func main() {
        var t1, t2 Thing
        data := []byte("{ \"id\": \"abc\", \"values\": [1,2,3]}")
        data2 := []byte("{ \"id\": \"def\", \"values\": [\"elephant\", \"tomato\", \"arrow\"]}")
        _ = json.Unmarshal(data, &t1)
        _ = json.Unmarshal(data2, &t2)
        print(t1.Values)
        print(t2.Values)
    }