2013-08-30 86 views
10

我想創建一個地圖,我可以轉變成JSON對象如將字符串映射到json對象的多種類型?

{ 
    "a": "apple", 
    "b": 2 
} 

但golang指定該地圖類型來聲明,所以可有地圖[字符串]字符串或映射[字符串] INT。我如何創建一個像上面這樣的json對象?

注意:直到運行時或需要創建json對象時,我纔會知道需要哪些數據和/或類型。因此,我不能只是創造這樣

type Foo struct { 
    A string `json:"a"` 
    B int `json:"b"` 
} 

回答

19

您可以隨時使用interface{}存儲任何類型的對象。正如在encoding/json包中的文件說:

解組JSON成接口值,解組解組的JSON到包含在接口值的具體值。如果接口值是零,也就是中存儲有沒有具體的值,解組存儲在接口值的其中之一:

布爾,爲JSON布爾
float64,爲JSON數字
字符串,JSON串
[]接口{},對於JSON陣列
地圖[字符串]界面{},對於JSON對象
零爲JSON空

只要執行以下操作:

m := map[string]interface{}{"a":"apple", "b":2} 
+0

你的值也可以是一個數組嗎? m:= map [string] interface {} {「a」:「apple」,「b」:2,「c」:[「foo」,2,「bar」,false,{「baz」 「bat」,「moreFoo」:7}]}' –

+1

@BrantleyBeaird好的!空接口('interface {}')包含任何類型,包括數組。由於數組本身包含任意類型,因此它將變爲類型'[] interface {}' – ANisus

+0

接口類型(其中'interface {}'是指定任何方法的接口類型)可以包含任何基礎類型,但是它們會增加運行時間開銷在內存使用方面(附加類型信息在其值被轉換爲接口值時被存儲)和一些處理。從動態語言中可以使用某些靈活性來支付合理的代價,但在沒有理由的情況下不能使用。接口類型可以包含除另一種接口類型之外的任何基礎類型這包括普通類型,如int,float64,還包括數組,地圖,通道等。 – thomasrutter