将嵌套映射封送到JSON中

时间:2016-02-13 07:53:07

标签: json go

我试图将这个嵌套的地图编组成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仅支持字符串键。令我困惑的是,上面的地图似乎没有任何非字符串键。

如果我删除嵌套的sasscollections密钥,则会在没有任何问题的情况下进行整理。

是否可以在地图上进行一些完整性检查以确认所有的键都是string而不只是interface{}看起来像字符串?

2 个答案:

答案 0 :(得分:1)

最有可能的是,子映射由YAML解析器创建为map [interface {}] interface {}。

使用"%#v"打印您的地图而不是"%v"你会看到类型。

Here's an example

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

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