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

将嵌套映射编组为 JSON

将嵌套映射编组为 JSON

Go
慕娘9325324 2021-12-13 17:14:38
我正在尝试将此嵌套映射编组为 JSON 字符串。map[  description:Foo Bar  url:http://foobar.co.uk  theme_color:#1b1b1b  markdown:kramdown  sass:map[    style:compressed  ]  collections:map[    projects:map[      output:true      permalink:/project/:path    ]    jobs:map[      output:true      permalink:/job/:path    ]  ]  title:Foo Bar  email:foo@foobarco.uk](清理输出fmt.Printf("%v", m))最初读取并解析配置文件以生成映射,因此我事先不知道这些字段,这意味着我不能(?)使用结构。从 YAML 解组到这张地图map[string]interface{}工作正常,但是当我将此地图传递给 时json.Marshal,出现以下错误。json: unsupported type: map[interface {}]interface{}通过阅读,我可以看到抛出此错误是因为 JSON 仅支持字符串键。让我感到困惑的是,上面的地图似乎没有任何非字符串键。如果我删除嵌套sass和collections键,它可以毫无问题地进行编组。是否可以在地图上进行一些完整性检查以确认所有键都是真实的string,而不仅仅是interface{}看起来像字符串?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

最有可能的是,YAML 解析器将子地图创建为 map[interface{}]interface{}。

用“%#v”而不是“%v”打印你的地图,你会看到类型。

package main


import "fmt"


func main() {

    a := map[string]interface{}{

        "A": map[interface{}]interface{}{

            "B": 123,

        },

    }

    fmt.Printf("%#v\n",a)

}

产生:


map[string]interface {}{"A":map[interface {}]interface {}{"B":123}}


查看完整回答
反对 回复 2021-12-13
?
POPMUISE

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

使用github.com/json-iterator/go包而不是encode.json. 它可以编码map[interface{}]interface{}JSON.

https://github.com/json-iterator/go


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

添加回答

举报

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