あなたが期待するタイプの値にarrray別の解決策は、あなたのJSONの様々な要素を非整列化することであり、このプロセスは/あなたがそれを必要とすべきであるstring
の値についてObj
ラッパーを作成します。
入力はJSON配列なので、配列またはスライスに非整列化することができます。また、エレメントのタイプが異なるため、Go配列またはスライスのエレメントタイプはinterface{}
でなければなりません。
タイプ[]interface{}
の値に非マーシャルすると、encoding/json
パッケージがオブジェクト要素としてmap[string]interface{}
を選択します。しかし、あなたは、あなたに非整列化したいタイプの要素を持つ前に、ターゲットスライスを取り込む場合json
パッケージには素直にそれらを使用します。
func main() {
res := []interface{}{
&Obj{},
"",
&Obj{},
}
if err := json.Unmarshal([]byte(src), &res); err != nil {
panic(err)
}
for _, v := range res {
fmt.Printf("type = %-10T value = %+q\n", v, v)
}
}
const src = `[
{"name": "obj1", "key2": ["a", "b"]},
"obj2",
{"name": "obj3"}
]`
出力(Go Playground上でそれを試してみてください):
type = *main.Obj value = &{"obj1" ["a" "b"]}
type = string value = "obj2"
type = *main.Obj value = &{"obj3" []}
セイ'Obj'構造体には多くのプロパティがあります。これを何度も繰り返さないようにする方法はありますか? –
@MathiasBakはい、 'type Obj2 Obj'のような型宣言を使用し、型変換を使用して' * o'に結果を代入します: '* o = Obj(obj)'。 [Go Playground](https://play.golang.org/p/SCpSwg_vU-)の例を参照してください。私は個人的に構造体を複製する代わりにこれをお勧めします。あるいは、新しい型の 'Obj2 Obj型を宣言し、' o'自体を '* Obj2'型の値に代入してください:var obj * Obj2 =(* Obj2)(o)'結果をコピーしても、 'json'パッケージは' o'自体にアンマーシャルされます。 [Playground](https://play.golang.org/)でこれをご覧ください。これによりパフォーマンスが向上します。 – icza