将嵌套的映射转换为JSON

4
我尝试将这个嵌套的map转换为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 只支持字符串键而引发的。令我困惑的是,上面的 map 似乎没有任何非字符串键。

如果我删除嵌套的 sasscollections 键,它就可以正常转换了。

是否可以对该 map 进行一些检查以确认所有的键实际上都是 string 而不仅仅是看起来像 interface{} 的字符串?


抱歉,这不是一个有效的地图... - Markus W Mahlberg
这不是字面意义上的,而是在创建地图后的输出结果。 - Dan Prince
3个回答

2

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}}

6
这是原因,而不是解决方案 :) - Taleh Ibrahimli

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接