JSON データをアンマーシャリングする場合、多くの場合、ネストされたオブジェクトを Go 型に解析するのではなく、不透明な値として扱うことが望ましいです。これは、encoding/json パッケージで提供される RawMessage タイプを使用して実現できます。
次の JSON と Go 構造体を考慮してください:
{ "id": 15, "foo": { "foo": 123, "bar": "baz" } }
type Bar struct { Id int64 Foo []byte }
試行中この JSON を Bar 構造体にアンマーシャリングすると、次のようになります。エラー:
json: cannot unmarshal object into Go value of type []uint8
ネストされたオブジェクトを文字列またはバイトのスライスとして保存するには、RawMessage タイプを使用します:
type Bar struct { Id int64 Foo json.RawMessage }
ドキュメントに記載されているとおり, RawMessage は、マーシャラーとアンマーシャラーの両方を実装する生のエンコードされた JSON オブジェクトです。
これは実際の例です:
package main import ( "encoding/json" "fmt" ) var jsonStr = []byte(`{ "id": 15, "foo": { "foo": 123, "bar": "baz" } }`) type Bar struct { Id int64 Foo json.RawMessage } func main() { var bar Bar if err := json.Unmarshal(jsonStr, &bar); err != nil { panic(err) } fmt.Printf("%+v", 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]}
[Playgroundリンク](https://play.golang.org/p/L2yJj2e72dS)
以上がGo でネストされた JSON オブジェクトを文字列またはバイトとして処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。