为了账号安全,请及时绑定邮箱和手机立即绑定

取一个 JSON 字符串,将其解组为 map[string]interface{}

取一个 JSON 字符串,将其解组为 map[string]interface{}

Go
侃侃无极 2021-09-20 10:50:10
我正在做非常基本的 JSON 操作来学习一些 Go,并且它有效,除了一件事似乎不对,我必须编写分配.(map[string]interface{})并.([]interface{})访问 JSON 中的条目,特别是如果它们是孩子的孩子的孩子等。见这里(也在 Go Playground 上:https : //play.golang.org/p/Wd-pzHqTsU):package mainimport (    "fmt"    "encoding/json")func main() {    JSON := []byte(`{"key1":"val1","key2":{"c1key1":"c1val1"},"key3":[{"c2key1":{"c3key1":"c3val1"}}]}`)    fmt.Printf("%s\n", JSON)    var d map[string]interface{}    json.Unmarshal(JSON, &d)    fmt.Println(d["key3"].([]interface{})[0].(map[string]interface{})["c2key1"].(map[string]interface{})["c3key1"])    d["key3"].([]interface{})[0].(map[string]interface{})["c2key1"].(map[string]interface{})["c3key1"] = "change1"    fmt.Println(d["key3"].([]interface{})[0].(map[string]interface{})["c2key1"].(map[string]interface{})["c3key1"])    JSON, _ = json.Marshal(d)    fmt.Printf("%s\n", JSON)}返回:{"key1":"val1","key2":{"c1key1":"c1val1"},"key3":[{"c2key1":{"c3key1":"c3val1"}}]}c3val1change1{"key1":"val1","key2":{"c1key1":"c1val1"},"key3":[{"c2key1":{"c3key1":"change1"}}]}现在在 Python 中,我只是直接访问键/值,而不是定义我每次访问的类型,而不是fmt.Println(d["key3"].([]interface{})[0].(map[string]interface{})["c2key1"].(map[string]interface{})["c3key1"])你做print d["key3"][0]["c2key1"]["c3key1"]蟒蛇示例:import jsonJSON = '{"key3": [{"c2key1": {"c3key1": "c3val1"}}], "key2": {"c1key1": "c1val1"}, "key1": "val1"}'print JSONd = json.loads(JSON)print d["key3"][0]["c2key1"]["c3key1"]d["key3"][0]["c2key1"]["c3key1"] = "change1"print d["key3"][0]["c2key1"]["c3key1"]JSON = json.dumps(d)print JSON那么我在 Go 中这样做对吗?如果是这样,这种设计的原因是什么?或者如果没有,我该怎么做?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

不,这不是在 Go 中处理结构化 JSON 数据的最正确方法。相反,最好创建一个“结构层次结构”并将您的 JSON 解组为结构。例如


type Data struct {

    Key1 string

    Key2 struct {

        C1Key1 string

    }

    Key3 []Key3

}


type Key3 struct {

    C2Key1 struct {

        C3Key1 string

    }

}

这种方法:


使您可以更好地控制数据的(取消)编组方式(通过结构标记json.Unmarshaler和json.Marshaler接口)

让你摆脱类型断言

相反,给你更多的类型安全

具有更好的性能,因为与映射访问相比,结构访问基本上是免费的。

游乐场:https : //play.golang.org/p/9XIh8DX1Ms。


查看完整回答
反对 回复 2021-09-20
  • 2 回答
  • 0 关注
  • 338 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信