2015-12-18 66 views

回答

1

正如你可能知道,你可以解組的任何有效的JSON爲map[string]interface{}。已經解鎖到Foo的實例已經沒有可用的元數據,你可以檢查被排除的字段或類似的東西。但是,您可以將這兩種類型解組,然後檢查映射中與密鑰Foo上的字段不匹配的密鑰。

in := []byte(`{"bar":"aaa", "baz":123}`) 

foo := &Foo{} 
json.Unmarshal(in,foo) 

allFields := &map[string]interface{} 
json.Unmarshal(in, allFields) 
for k, _ := range allFields { 
    fmt.Println(k) 
    // could also use reflect to get field names as string from Foo 
    // the get the symmetric difference by nesting another loop here 
    // and appending any key that is in allFields but not on Foo to a slice 
} 
+0

非常有趣的解決方案。對於深嵌套的結構可能會有點困難,但應該使用簡單的結構。 – captncraig

+0

@ captncraig是的它不是理想的。如果你想得到真正的認可,我想你可以實現一個通用的解決方案,通過展開'allFields'映射並使用遞歸算法來獲取所有字段在具體類型中的嵌套結構。獲取字段名稱的FYI可能會發現這很有用; http://stackoverflow.com/questions/24337145/get-name-of-struct-field-using-reflection – evanmcdonnal

+0

我真的很喜歡這個toml庫如何處理它:https://godoc.org/github.com/BurntSushi/ toml#MetaData.Undecoded,但那樣的事情將需要改變核心json包:( – captncraig

相關問題