json - 有什么方便的方法可以在没有类型断言的情况下获取 JSON 元素吗?

标签 json dictionary go slice

处理来自 Web 服务器的 JSON 响应时存在一些不便。

比如我事先不知道JSON的数据结构(也不想对其建模),只想从中获取值!

所以,对于 Python,我可以只写

value = response["body"][4]["data"]["uid"]  //response is a dictionary

但是对于 Golang,我需要为每个元素做断言!

value := response["body"].([]interface{})[4].(map[string]interface{})["data"].(map[string]interface{})["uid"]
//response is a map[string]interface{}

这是我用golang写的,得到我需要的值。你对此有何建议?对于这种情况有什么有用的提示吗?

最佳答案

如果您使用结构对 JSON 对象建模并解码为该结构的值,那么您不需要那些丑陋的索引和类型断言,您可以简单地引用结构字段。
请注意,您不必害怕响应很复杂,您只需要对您打算使用的部分进行建模即可。例如。如果响应是一个包含一百个字段的对象,但您只需要 2 个,则创建一个仅包含这 2 个字段的结构。

如果您不想为您的 JSON 对象建模(或者不能因为它是动态的),那么您可以编写一个通用的实用函数,该函数根据路径(一系列映射键和 slice 索引),你可以在这个答案中看到:Taking a JSON string, unmarshaling it into a map[string]interface{}, editing, and marshaling it into a []byte seems more complicated then it should be

最后,您可以使用已经包含此辅助功能的第三方库,例如 https://github.com/icza/dyno (披露:我是作者)。

使用 github.com/icza/dyno ,它看起来像这样:

value, err := dyno.Get(response, "body", 4, "data", "uid")

关于json - 有什么方便的方法可以在没有类型断言的情况下获取 JSON 元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48377503/

相关文章:

javascript - $.ajax 检查返回字符串是否为 'ERROR'

python - 将 dict 的 pandas dataframe 列扩展为 dataframe 列

go - 如何访问在GOHTML模板中动态创建的行?

golang,大括号或返回的奇怪错误

java - 点的 JsonPath JUnit 转义字符

c# - Unity 使用 IENumerator 设置另一个对象将使用的类

javascript:从字典键获取对象的索引

concurrency - 从不同的 goroutine 访问一个 channel

python - 将 Python 列表组合在一起以获得公共(public)元素

C++ 循环遍历 map