当前位置: 首页 > 面试题库 >

golang json和接口切片

方通
2023-03-14
问题内容

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

通过尝试使用返回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
        }
    }
}

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


问题答案:

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



 类似资料:
  • 问题内容: 我有一个接口,该接口由struct实现。 要获取模型实例,我具有以下辅助函数: 上面的方法允许我返回正确类型的Person实例(以后可以使用相同的方法轻松添加新模型)。 当我尝试执行类似的操作以返回模型切片时,出现错误。码: 去抱怨: 我的目标是回到请求任何机型的切片(是否,,,W / E)。我缺少什么,如何正确实施这样的解决方案? 问题答案: 简短的答案是您是正确的。结构的片段不等于

  • 我对这些问题有很多困惑。可以举例说明。 我正在搜索标记接口和普通接口?有些网站给出“接口中没有方法称为标记接口”,但有些网站在标记接口中也给出Runnable。但是正确答案是什么?

  • 问题内容: 我到处都读到有关Spring如何鼓励您在代码中使用接口的信息。我没看到 您的spring xml配置中没有接口的概念。Spring的哪一部分实际上鼓励您使用接口(而不是文档)? 问题答案: 为类定义接口时,它有助于进行依赖项注入。您的Spring配置文件本身不包含任何有关接口的信息-您只需输入类的名称即可。 但是,如果您要注入另一个提供“等效”功能的类,则使用接口确实会有所帮助。 例如

  • 嗨,我在libgdx切换屏幕时遇到了问题。我正在建造一个小行星游戏克隆。因此,首先呈现我的Main MenuScreen类(使用Fitviewport),然后我调用setScreen()到GameScreen(GameScreen不使用Fitviewport),除了第二个屏幕呈现为使用Fitviewport。如果我调整第二个屏幕的大小,那么整个窗口用于渲染。为什么会发生这种情况?这里有一些图片..

  • 问题内容: 我有两个接口,和。碰巧包括。最后,我有一个具体的实现(称为),根据定义,它也实现了。 例如: 由于要求和实施,它也令人满意。 如果我尝试跨函数传递单个项目,则效果很好。但是,如果我尝试对Expecting函数进行切片,它将失败。 例: 如果我可以将传递给,为什么我不能传递给,我将如何纠正它? https://play.golang.org/p/QOREQJTQhD上的实际实现只是取消注

  • 问题内容: 给定您具有接受功能的场景。如果确定是切片,我如何在该切片上? 前往游乐场示例:http://play.golang.org/p/DNldAlNShB 问题答案: 好吧,我曾经使用过,然后如果它是一个切片,则可以调用,并在该值上调用以在索引处获取切片和元素的。我认为您将无法使用范围操作来做到这一点。 前往游乐场示例:http : //play.golang.org/p/gQhCTiwPA