Go

如何正确解组不同类型的数组?

发布于 2021-02-01 11:15:47

只要我有键值对,解组就非常简单了,但是我将如何以不同的顺序解组不同类型的数组呢?单个元素定义明确且已知,但顺序不明确。

我无法提出一个漂亮的解决方案。

我会尝试对所有元素进行错误处理吗?是否有某种工会类型可以为我做到这一点?

游乐场版

package main

import (
    "encoding/json"
    "fmt"
)

var my_json string = `{
    "an_array":[
        "with_a string",
        {
            "and":"some_more",
            "different":["nested", "types"]
        }
    ]
}`

type MyInner struct {
    And     string
    Different   []string
}

type MyJSON struct {
    An_array []json.RawMessage
}

func main() {
    var my_json_test MyJSON

    e := json.Unmarshal([]byte(my_json), &my_json_test)
    if e != nil {
        fmt.Println(e)
    } else {
        for index, value := range my_json_test.An_array {
            fmt.Println("index: ", index)
            fmt.Println("value: ", string(value))
        }
        var my_inner MyInner
        err := json.Unmarshal(my_json_test.An_array[1], &my_inner)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println("inner structure: ", my_inner)
        }
    }
}
关注者
0
被浏览
91
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    Go官方博客上有一篇不错的文章encoding/jsonJSON和GO。可以将“任意数据解码”到接口{}中,并使用类型断言来动态确定类型。

    您的代码可能可以修改为:

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    var my_json string = `{
        "an_array":[
        "with_a string",
        {
            "and":"some_more",
            "different":["nested", "types"]
        }
        ]
    }`
    
    func WTHisThisJSON(f interface{}) {
        switch vf := f.(type) {
        case map[string]interface{}:
            fmt.Println("is a map:")
            for k, v := range vf {
                switch vv := v.(type) {
                case string:
                    fmt.Printf("%v: is string - %q\n", k, vv)
                case int:
                    fmt.Printf("%v: is int - %q\n", k, vv)
                default:
                    fmt.Printf("%v: ", k)
                    WTHisThisJSON(v)
                }
    
            }
        case []interface{}:
            fmt.Println("is an array:")
            for k, v := range vf {
                switch vv := v.(type) {
                case string:
                    fmt.Printf("%v: is string - %q\n", k, vv)
                case int:
                    fmt.Printf("%v: is int - %q\n", k, vv)
                default:
                    fmt.Printf("%v: ", k)
                    WTHisThisJSON(v)
                }
    
            }
        }
    }
    
    func main() {
    
        fmt.Println("JSON:\n", my_json, "\n")
    
        var f interface{}
        err := json.Unmarshal([]byte(my_json), &f)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Printf("JSON: ")
            WTHisThisJSON(f)
        }
    }
    

    它给出的输出如下:

    JSON:
     {
        "an_array":[
        "with_a string",
        {
            "and":"some_more",
            "different":["nested", "types"]
        }
        ]
    }
    
    JSON: is a map:
    an_array: is an array:
    0: is string - "with_a string"
    1: is a map:
    and: is string - "some_more"
    different: is an array:
    0: is string - "nested"
    1: is string - "types"
    

    尚未完成,但显示了它如何工作。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看