一尘不染

golang json和接口切片

go

我在遍历包含接口切片的接口切片时遇到麻烦。

通过尝试使用返回JSON数据的API调用产生了此问题。返回的数据很多,根据请求的不同,结构也有很大不同。API文档中也没有JSON响应的结构,因此我试图实现一些用于处理任意JSON响应的方法。

当前,当进行初始调用时,将其放入map [string] interface
{}中,然后运行switch语句以确定每个元素的类型,当遇到一片接口时就会出现问题。我似乎对他们无能为力。

我试过几次使用sort包(特别是sort和slicestable函数)无济于事。

我收到的错误是:

interface conversion: interface {} is []interface {}, not map[string]interface {}

当我尝试映射接口切片时会发生这种情况,以便可以再次使用switch语句对其进行迭代。

output := make(map[string]interface{})
err = json.Unmarshal(body, &output)

fmt.Println(err)
identify(output)

return err
}

func identify(output map[string]interface{}) {
    fmt.Printf("%T", output)
    for a, b := range output {
        switch bb := b.(type) {
        case string:
            fmt.Println("This is a string")
        case float64:
            fmt.Println("this is a float")
        case []interface{}:
            fmt.Println(" is []interface ", bb)
            test := b.(map[string]interface{}) // falis here
            fmt.Println("Success!", test)
        default:
            return
        }
    }
}

因此,基本问题是如何在不事先知道结构的情况下迭代嵌套的接口切片?


阅读 474

收藏
2020-07-02

共1个答案

一尘不染

您可以添加一个切换用例,该用例要检查接口切片的接口类型,然后运行与递归相同的功能,直到解析整个json。

output := make(map[string]interface{})
err = json.Unmarshal(body, &output)

fmt.Println(err)
identify(output)

return err
}

func identify(output map[string]interface{}) {
    fmt.Printf("%T", output)
    for a, b := range output {
        switch bb := b.(type) {
        case string:
            fmt.Println("This is a string")
        case float64:
            fmt.Println("this is a float")
        case []interface{}:
        // Access the values in the JSON object and place them in an Item
        for _, itemValue := range jsonObj {
            fmt.Printf("%v is an interface\n", itemValue)
            identify(itemValue.(map[string]interface{}))
        }
        default:
            return
        }
    }
}

可以有深度嵌套的json。我们只需要为每种情况创建选项,直到完全解析json。

2020-07-02