JSON 応答を処理する場合、特定のネストされたオブジェクトを生の文字列またはバイト配列として保存する必要がある場合があります。それらを Go 構造に解析します。これに対処するために、encoding/json パッケージの json.RawMessage タイプを使用する解決策を検討します。
特定のシナリオでは、次の JSON:
{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }
がアンマーシャリングされます。 int64 型の ID フィールドと []byte 型の Foo フィールドを持つ Go 構造体に変換します。発生したエラー「json: オブジェクトを型 []uint8 の Go 値にアンマーシャリングできません」は、アンマーシャリング プロセスが foo オブジェクトを Go 値に解析しようとしていたことを示しており、これは意図された動作ではありません。
json.RawMessage タイプは、この問題の解決策を提供します。ドキュメントに記載されているように、これは JSON デコードを遅らせたり、JSON エンコードを事前計算したりするために使用できる「生のエンコードされた JSON オブジェクト」です。 json.RawMessage を使用すると、foo オブジェクトを生のバイト配列として Go 構造体に効果的に保存できます。
import ( "encoding/json" "fmt" ) type Bar struct { ID int64 `json:"id"` Foo json.RawMessage `json:"foo"` } func main() { var jsonStr = []byte(`{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }`) var bar Bar err := json.Unmarshal(jsonStr, &bar) if err != nil { panic(err) } fmt.Printf("%+v\n", bar) }
出力:
{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}
json.RawMessage を利用すると、次のことができます。 JSON を、foo オブジェクトをバイト配列として扱う Go 構造にアンマーシャルできるようになりました。
以上がGo で JSON ネストされたオブジェクトをバイト配列としてアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。