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

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

Mary-Kate Olsen
リリース: 2024-11-29 07:15:11
オリジナル
557 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート