所以我试图解析一个JSON响应.它可以是多层次的.我就是这么做的:

var result map[string]interface{}
json.Unmarshal(apiResponse, &result)

Firstly, is this the right way to do it?

我们假设回应如下:

{
  "args": {
            "foo": "bar"
          }
}

要访问密钥foo,我看到一个playground正在执行以下操作:

result["args"].(map[string]interface{})["foo"]

这里,.()的记数法是什么?这是对的吗?

推荐答案

符号x.(T)被称为Type Assertion.

对于接口类型和类型T的表达式x,主表达式x.(T)断言x不是nil,并且存储在x中的值是类型T.

你的例子:

result["args"].(map[string]interface{})["foo"]

这意味着与关键点"args"相关联的results贴图的值属于类型map[string]interface{}(另一个具有string个关键点和任何值的贴图).并且您想要访问与键"foo"相关联的映射的元素.

如果您对输入JSON格式一无所知,那么是的,您必须使用通用的map[string]interface{}类型来处理它.如果您知道输入JSON的确切 struct ,则可以创建struct以匹配预期字段,这样您就可以将JSON文本解组为自定义struct类型的值,例如:

type Point struct {
    Name string
    X, Y int
}

func main() {
    in := `{"Name":"center","X":2,"Y":3}`

    pt := Point{}
    json.Unmarshal([]byte(in), &pt)

    fmt.Printf("Result: %+v", pt)
}

输出:

Result: {Name:center X:2 Y:3}

Go Playground号公路上试试吧.

为你的输入建模

您当前的JSON输入可以用此类型建模:

type Data struct {
    Args struct {
        Foo string
    }
}

和接入Foo(在Go Playground):

d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)

Go相关问答推荐

如何在jsonrpc服务器的服务器端捕获错误?

为什么(编码器).EncodeElement忽略";,innerxml";标记?

如何用Golang解码这个嵌套的json?

Docker Compose Health Check未退出,错误为无法启动

Python样式生成器实现为通道:过早读取

如何确定泛型类型在运行时是否可比较?

Go 1.20 中如何计算连接错误?

如何在 zap 记录器库中使用自定义时间函数

未实现的 desc = 未知服务 pb.AuthService 我的简单身份验证服务器上出现错误

Go - 永远停止带有上下文的循环

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

对 CSV 进行单元测试失败

是否可以从 golang 中的参数推断类型?

动态 SQL 集 Golang

Golang并发写入多个文件

从golang中的url加载图像

Ginkgo/Gomega panic 测试失败

Golang:每个键具有多个值的映射

如何正确判断 io.Reader 是否为零?

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For