ホームページ >バックエンド開発 >Golang >Go でインターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-27 16:58:11525ブラウズ

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

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