ホームページ > バックエンド開発 > Golang > JSON を Go のインターフェースに効果的にアンマーシャリングする方法{}

JSON を Go のインターフェースに効果的にアンマーシャリングする方法{}

DDD
リリース: 2024-12-30 03:50:09
オリジナル
128 人が閲覧しました

How to Effectively Unmarshal JSON into an Interface{} in Go?

Go で JSON をインターフェースにアンマーシャリングする{}: 詳細ガイド

JSON をインターフェースにアンマーシャリングする方法を理解することは、Go 開発者にとって重要なスキルです。この記事では、JSON をインターフェース フィールドを持つ構造体にアンマーシャリングすることに関連する落とし穴と解決策を示す実践的な例を説明します。

次の型定義について考えてみましょう。

type Message struct {
    Cmd string `json:"cmd"`
    Data interface{} `json:"data"`
}

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}
ログイン後にコピー

作成メッセージを表す JSON 文字列が与えられると、それをメッセージにデコードしようとする可能性がありますstruct:

{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
ログイン後にコピー
import "encoding/json"

var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`)

var m Message
if err := json.Unmarshal(data, &m); err != nil {
    log.Fatal(err)
}
ログイン後にコピー

アンマーシャリングされたメッセージ構造体を調べると、データ フィールドがマップ[文字列]インターフェイスとして残っていることがわかります。{}:

{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
ログイン後にコピー

インターフェイスの克服{} 落とし穴

この制限を克服するために、2 つの方法を採用しています。アプローチ:

  1. メッセージの固定部分の構造体タイプを定義します。 これには、メッセージのバリアント部分をキャプチャするための cmd フィールドと json.RawMessage フィールドが含まれます。
  2. 各バリアント型の構造体の型を定義します。 この場合、CreateMessage を定義します。 struct.
type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  
ログイン後にコピー

これらの変更により、次のコマンドに基づいてバリアント データを適切な構造体タイプにデコードできます。

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
ログイン後にコピー

この手法を採用することで、次のことが可能になります。 JSON データが Message 構造体に正常にアンマーシャリングされます。Data フィールドにはバリアント CreateMessage タイプが含まれます。完全な実装については、提供されているプレイグラウンドの例を参照してください。

以上がJSON を Go のインターフェースに効果的にアンマーシャリングする方法{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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