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
}
the playground
非整列化JSONとGolangタイプ変換/アサーション発行し
の利用可能な
すなわち、私はGeneralConfig
の代わりに、ネストされた構造体を使用することができることを理解し、それはペイロードの正確な構造を知っている私を必要とします別のキーでは機能しません(私は "important_key"にロックされます)。
「important_key」の値がわからない場合のゴーラ対策はありますか?可能であれば、すべての "important_keys"にはこの問題を解決するための定数の親キーを持たせる必要があるため、golangと言います。要約すると、任意のjsonオブジェクトでは、キーをトラバースできる方法が必要であり、値がカスタムタイプの場合はその値をそのタイプに変換します。今のところ、タイプ変換を使用すると、タイプがinterface{}
であることがわかり、タイプアサーションを使用する必要があります。ただし、タイプアサーションを使用すると、interface{}
はmap[string]interface{}
ではなく、main.GeneralConfig
であることがわかります。
私の助言は、スキーマを把握することです。 「任意の」jsonのようなものはありません。私は彼らのjsonがとても予測不可能だと考えるので、劣ったアプローチを取っている人々の本当の病気です。私はあなたのためのニュースを持っています、それはそうではありません!私はスキーマを使ってはるかに多くの変形と複雑なjsonを解析しましたが、それほど難しくありませんでした。 jsonは形式的な言語ですが、ブロブを記述するための正確なスキーマがあり、非常に柔軟性があります。 – evanmcdonnal
ネストされたjson構造体を持ち、それを非整列化すると、map [string]インタフェース{}で終了します。interface {}部分(ネスト部分の場合)は、map [string]インターフェース{}です。したがって、あなたのインターフェース{}がマップではないことがわかるまで、トラバースを続けることができます。使用したいjsonのサンプルを提供する場合は、解決策を見つけることができます。 –
@evanmcdonnalこれは理論上のもので、これはどうしたらいいですか?実用的な目的のために、私はあなたと同じ結論に達しました。 –