Go でインターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法

Susan Sarandon
リリース: 2024-11-27 16:58:11
オリジナル
494 人が閲覧しました

How to Unmarshal JSON into a Specific Struct Using an Interface Variable in Go?

インターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法

問題:

JSON をインターフェース変数にアンマーシャリングすると、encoding/json パッケージはそれを次のように解釈します。地図。代わりに特定の構造体を使用するように指示するにはどうすればよいですか?

説明:

JSON パッケージには、アンマーシャリング時にターゲットとなる具象型が必要です。 Interface{} 変数を渡しても十分な情報は得られません。パッケージはデフォルトでオブジェクトの場合は map[string]interface{}、配列の場合は []interface{} になります。

解決策:

インターフェイス変数を使用して具体的な構造体型にアンマーシャルするように json.Unmarshal に指示する組み込みの方法はありません。ただし、回避策があります。

  1. インターフェイス変数内の目的の構造体へのポインタをラップします。
func getFoo() interface{} {
    return &Foo{"bar"}
}
ログイン後にコピー
  1. ラップされたポインタを次のように渡します。 json.Unmarshal.
err := json.Unmarshal(jsonBytes, fooInterface)
ログイン後にコピー
  1. インターフェイス変数を介してアンマーシャリングされたデータにアクセスします。
fmt.Printf("%T %+v", fooInterface, fooInterface)
ログイン後にコピー

例:

次のコードは、テクニック:

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {

    fooInterface := getFoo() 
    
    myJSON := `{"bar":"This is the new value of bar"}`
    jsonBytes := []byte(myJSON)

    err := json.Unmarshal(jsonBytes, fooInterface)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) // prints: *main.Foo &{Bar:This is the new value of bar}
}
ログイン後にコピー

以上がGo でインターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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