我试图将这个嵌套的地图编组成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{}
看起来像字符串?
答案 0 :(得分:1)
最有可能的是,子映射由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}}
答案 1 :(得分:0)
使用 github.com/json-iterator/go
包代替 encode.json
。它可以将 map[interface{}]interface{}
编码为 JSON
。