将嵌套映射编组为 JSON

我正在尝试将此嵌套映射编组为 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{}看起来像字符串?


慕娘9325324
浏览 279回答 2
2回答

慕容708150

最有可能的是,YAML 解析器将子地图创建为 map[interface{}]interface{}。用“%#v”而不是“%v”打印你的地图,你会看到类型。package mainimport "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}}

POPMUISE

使用github.com/json-iterator/go包而不是encode.json. 它可以编码map[interface{}]interface{}为JSON.https://github.com/json-iterator/go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go