json.ネストされたオブジェクトを文字列または[]byteにアンマーシャルする 質問する

json.ネストされたオブジェクトを文字列または[]byteにアンマーシャルする 質問する

ネストされたオブジェクトが解析されずに、単に または として扱われるように、いくつかの json を非整列化しようとしていstringます[]byte

そこで、次のものを取得したいと思います。

{
    "id"  : 15,
    "foo" : { "foo": 123, "bar": "baz" }
}

アンマーシャリングすると次のようになります:

type Bar struct {
    ID  int64  `json:"id"`
    Foo []byte `json:"foo"`
}

次のエラーが発生します:

json: cannot unmarshal object into Go value of type []uint8

遊び場デモ

ベストアンサー1

あなたが探しているのは生のメッセージパッケージに入力しますencoding/json

ドキュメントには次のように記載されています:

タイプRawMessage[]byte

RawMessage は、生のエンコードされた JSON オブジェクトです。Marshaler と Unmarshaler を実装し、JSON デコードを遅延したり、JSON エンコードを事前計算したりするために使用できます。

以下は RawMessage を使用した実際の例です。

package main

import (
    "encoding/json"
    "fmt"
)

var jsonStr = []byte(`{
    "id"  : 15,
    "foo" : { "foo": 123, "bar": "baz" }
}`)

type Bar struct {
    Id  int64           `json:"id"`
    Foo json.RawMessage `json:"foo"`
}

func main() {
    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]}

遊び場

おすすめ記事