2016-02-13 128 views
0

我試圖將此嵌套的地圖封送到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:[email protected] 
] 

(從fmt.Printf("%v", m)盪滌輸出)

最初是一個配置文件被讀取並分析產生的地圖,所以我不知道事先的領域,這意味着我不能(?)使用一個結構。

從YAML解組到這個map[string]interface{}的地圖工作正常,但是當我通過這個地圖到json.Marshal,我得到以下錯誤。

json: unsupported type: map[interface {}]interface{} 

從閱讀中可以看出,由於JSON僅支持字符串鍵,因此會引發此錯誤。令我困惑的是,上面的地圖似乎沒有任何非字符串鍵。

如果我刪除了嵌套的sasscollections鍵,它將在沒有任何問題的情況下編組。

是否可以在地圖上進行一些理智檢查,以確認所有鑰匙都是事實string而不僅僅是interface{}看起來像字符串?

+0

呃,這不是一個有效的地圖... –

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