json - Go 能够解码为 map[string][]interface{} 吗?

标签 json go unmarshalling

目前,我尝试将 JSON 解析为 map[string][]interface{},但解码返回错误。根据 ( https://golang.org/pkg/encoding/json/ ),为了将 JSON 解码为接口(interface)值,Unmarshal 将其中之一存储在接口(interface)值中:

  • bool,用于 JSON bool 值
  • float64,用于 JSON 数字
  • string,用于 JSON 字符串 -[]接口(interface){},用于JSON数组
  • map[string]interface{},用于 JSON 对象
  • nil 表示 JSON null

我想知道 golang 是否能够解码 map[string][]interface{}。以下是代码片段。我是 Golang 的新手,在此先感谢您的帮助。

// emailsStr looks like "{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}"

emailsRaw := make(map[string][]*entities.Email)
err := json.Unmarshal([]byte(emailsStr), &emailsRaw)

错误信息:

&json.UnmarshalTypeError{Value:"number", Type:(*reflect.rtype)(0x151c7a0), Offset:44, Struct:"", Field:""}

最佳答案

围棋 encoding/json包只会动态解码为 map[string]interface{} .从那里,您将需要使用类型断言和强制转换来提取您想要的值,如下所示:

func main() {
    jsonStr := `{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}`

    dynamic := make(map[string]interface{})
    json.Unmarshal([]byte(jsonStr), &dynamic)

    firstEmail := dynamic["unknown.0"].([]interface{})[0].(map[string]interface{})["email_address"]

    fmt.Println(firstEmail)
}

( https://play.golang.org/p/VEUEIwj3CIC )

每次,Go 的 .(<type>)运算符用于断言动态值并将其转换为特定类型。如果在运行时发生任何错误类型,这个特定的代码将会崩溃,就像 unknown.0 的内容一样。不是 JSON 对象数组。

在 Go 中更惯用(和健壮)的方法是用 json:"" 注释几个结构。标签并有 encoding/json解编成他们。这避免了所有讨厌的脆弱.([]interface{})类型转换:

type Email struct {
    Email string `json:"email_address"`
}

type EmailsList struct {
    IsSchemaConforming bool `json:"isSchemaConforming"`
    SchemaVersion      int  `json:"schemaVersion"`
    Emails []Email `json:"unknown.0"`
}

func main() {
    jsonStr := `{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}`

    emails := EmailsList{}
    json.Unmarshal([]byte(jsonStr), &emails)

    fmt.Printf("%+v\n", emails)
}

( https://play.golang.org/p/iS6e0_87P2J )

关于json - Go 能够解码为 map[string][]interface{} 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727958/

相关文章:

循环中的 JSON 键和 bash 变量

iphone - jackson 相当于 iPhone 吗?

Golang gorename 工具失败

go - 在非root用户路径中提供文件时出现404错误

html - 如何使用 jquery 从 Rotten Tomatoes 检索搜索列表?

json - 检查 json 数组长度而不解码

javascript - 绘图 D3 可视化中输入数据(CSV 或 JSON 格式)的最大容量?

ruby - 在 ruby​​ 中处理来自 json 的错误 UTF-8

java - 解码后返回 null 和空 List

java - 使用集合将 xml 解码为 bean