ホームページ >バックエンド開発 >Golang >Go でネストされた JSON オブジェクトを文字列またはバイトとして処理するにはどうすればよいですか?

Go でネストされた JSON オブジェクトを文字列またはバイトとして処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-29 07:15:11559ブラウズ

How to Handle Nested JSON Objects as Strings or Bytes in Go?

ネストされた JSON オブジェクトを文字列またはバイトとしてマーシャリングする

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

[Playgroundリンク](https://play.golang.org/p/L2yJj2e72dS)

以上がGo でネストされた JSON オブジェクトを文字列またはバイトとして処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。