ホームページ > バックエンド開発 > Golang > データが配列またはオブジェクトである可能性がある場合に JSON アンマーシャリングを処理する方法は?

データが配列またはオブジェクトである可能性がある場合に JSON アンマーシャリングを処理する方法は?

Susan Sarandon
リリース: 2024-12-13 19:00:13
オリジナル
393 人が閲覧しました

How to Handle JSON Unmarshalling When the Data Might Be an Array or an Object?

配列またはオブジェクトを使用して JSON をアンマーシャリングする方法

JSON を扱う場合、返されるデータが配列またはオブジェクトである可能性があるシナリオを処理するオブジェクトは難しい場合があります。この記事ではこの問題に対処し、json.RawMessage タイプの使用と JSON 構造に基づく動的アンマーシャリングを含む解決策を紹介します。

動的 JSON 構造の公開

検討次の JSON 応答:

{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
ログイン後にコピー
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
ログイン後にコピー

応答では、gwrcmd はオブジェクトまたは配列のいずれかになります。これを考慮して、カスタム Go 構造体は次のように定義されます。

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string
ログイン後にコピー

アンマーシャリングの難題を解決する

この問題を解決する鍵は、json.RawMessage を利用することにあります。 、任意の JSON 値を受け入れます。生の JSON を保持するためのラッパーを Response 構造体内に作成します。

type Response struct {
    RawAWrapper struct {
        RawA json.RawMessage `json:"a"`
    }
ログイン後にコピー

JSON 構造に基づく動的アンマーシャリング

Response 構造体の UnmarshalJSON メソッド内で、 RawAWrapper.RawA の最初のバイトを調べて、それが配列を表しているのかオブジェクトを表しているのかを判断します。結果に応じて、それに応じてデータをアンマーシャリングします。

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.RawAWrapper); err != nil {
        return err
    }
    if r.RawAWrapper.RawA[0] == '[' {
        return json.Unmarshal(r.RawAWrapper.RawA, &r.As)
    }
    return json.Unmarshal(r.RawAWrapper.RawA, &r.A)
}
ログイン後にコピー

このアプローチにより、複数の構造体を必要とせずに、さまざまな構造を持つ JSON を柔軟に処理できます。

以上がデータが配列またはオブジェクトである可能性がある場合に JSON アンマーシャリングを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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