package main
import (
"fmt"
"encoding/json"
"reflect"
)
type GeneralConfig map[string]interface{}
var data string = `
{
"key":"value",
"important_key":
{"foo":"bar"}
}`
func main() {
jsonData := &GeneralConfig{}
json.Unmarshal([]byte(data), jsonData)
fmt.Println(reflect.TypeOf(jsonData)) //main.GeneralConfig
jsonTemp := (*jsonData)["important_key"]
fmt.Println(reflect.TypeOf(jsonTemp)) //map[string]interface {}
//newGeneralConfig := GeneralConfig(jsonTemp)
//cannot convert jsonTemp (type interface {}) to type GeneralConfig:
//need type assertion
newGeneralConfig := jsonTemp.(GeneralConfig)
//fmt.Println(reflect.TypeOf(newGeneralConfig))
//panic: interface conversion: interface {} is map[string]interface {},
//not main.GeneralConfig
}
可我知道我可以代替GeneralConfig
使用嵌套結構,但這需要我知道的有效載荷,即確切的結構它不適用於不同的鍵(我將被鎖定到「important_key」)。Golang類型轉換/斷言問題與解組JSON
當我不知道「important_key」的價值是什麼時,是否有golang解決方法?我說golang,因爲如果可能的話,可以要求所有「important_keys」擁有一個常數父鍵,這可以解決這個問題。總結一下,給定一個任意的json對象,必須有一種方法可以遍歷它的鍵,並且如果一個值是一個自定義類型,則將該值轉換爲該類型。現在看來,如果我使用類型轉換,它告訴我,類型是interface{}
,我需要使用類型斷言;然而,如果我使用類型斷言,它告訴我,interface{}
是map[string]interface{}
而不是main.GeneralConfig
。
我的建議是找出模式。沒有「任意」json這樣的東西,我真的厭惡那些採取低劣方法的人,因爲他們認爲他們的json是如此不可預測。我有消息給你,這不是!我用模式解析了更多變體和複雜的json,並沒有那麼難。 json是一種形式語言,有一個確切的模式來描述任何blob,它們可以非常靈活。 – evanmcdonnal
當你有一個嵌套的json結構並解組它時,最終會得到一個map [string] interface {}。接口{}部分(如果它是嵌套部分)又是map [string] interface {}。所以你可以繼續遍歷,直到你發現你的界面不是地圖。如果你提供了一個你想使用的json的樣本,我們可以提出一個解決方案。 –
@evanmcdonnal這更像是一個'理論上,我該怎麼做?'爲了實際目的,我得出了和你一樣的結論。 –