ホームページ  >  記事  >  バックエンド開発  >  golangでJSONデータをマップタイプに変換する方法

golangでJSONデータをマップタイプに変換する方法

PHPz
PHPzオリジナル
2023-04-21 14:20:375423ブラウズ

Golang では、JSON が一般的なデータ交換形式であるため、JSON データをマップに変換する必要性も非常に一般的です。この記事では、Golangを使用してJSONデータをマップ型に変換する方法を紹介します。

  1. 標準ライブラリのアンマーシャル関数の使用

Golang の標準ライブラリには、多くの JSON 関連の関数と型が含まれており、その中で最も重要なものは json.Unmarshal 関数です。この関数は、JSON データを Go 言語のデータ構造にデコードします。

この関数を使用して、JSON 文字列をマップに変換できます。まず、JSON デコード結果を格納するために使用する変数を定義し、JSON 文字列を含むバイト配列を作成します。次に、 json.Unmarshal 関数を呼び出して、JSON 文字列をマップ タイプにデコードします。

以下は例です:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var data = []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    err := json.Unmarshal(data, &result)

    if err != nil {
        fmt.Println("JSON转换失败:", err)
        return
    }

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}

上記のコードでは、JSON デコード結果を格納するマップ タイプ変数 result を定義します。 json.Unmarshal を呼び出して JSON 文字列をデコードする場合は、結果のアドレスを渡す必要があります。最後に、結果のキーと値のペアを反復処理し、出力します。出力は次のとおりです。

name : Tom
age : 28
gender : male
  1. サードパーティ ライブラリ easyjson を使用します

Golang には easyjson というサードパーティ JSON シリアル化ライブラリもあります。 JSON を Go 言語のデータ型に簡単に変換します。標準ライブラリ json.Unmarshal とは異なり、easyjson はコード生成を使用して解析効率を向上させます。さらに、JSON のインライン型への解析や高速反復など、より高度な機能もサポートしています。

easyjson を使用するには、ライブラリをインストールし、ライブラリが生成するコードを Go コードに含める必要があります。まず、easyjson をインストールします。

go get github.com/mailru/easyjson

次に、JSON に変換する必要があるデータ型の easyjson テンプレートを定義します。 easyjson テンプレートは複数のファイルで構成されており、各ファイルには .go ファイルと _easyjson.go ファイルがあります。

以下は、easyjson テンプレートを使用して JSON 文字列をマップに変換するサンプル コードです:

package main

import (
    "fmt"

    "github.com/mailru/easyjson/jlexer"
    "github.com/mailru/easyjson/jwriter"
)

type Person struct {
    Name   string `json:"name"`
    Age    int    `json:"age"`
    Gender string `json:"gender"`
}

func main() {
    data := []byte(`{"name":"Tom","age":28,"gender":"male"}`)

    var result map[string]interface{}
    r := jlexer.Lexer{Data: data}
    result = parseMap(&r)

    for key, value := range result {
        fmt.Printf("%s : %v\n", key, value)
    }
}

func parseMap(r *jlexer.Lexer) map[string]interface{} {
    result := map[string]interface{}{}
    for {
        key := r.String()
        r.WantColon()
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result[key] = parseMap(r)
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result[key] = parseArray(r)
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result[key] = r.Int()
        case jlexer.String:
            result[key] = r.String()
        case jlexer.Null:
            result[key] = nil
        case jlexer.True:
            result[key] = true
        case jlexer.False:
            result[key] = false
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}

func parseArray(r *jlexer.Lexer) []interface{} {
    result := []interface{}{}
    for {
        switch r.PeekToken() {
        case '{':
            r.Discard()
            result = append(result, parseMap(r))
            if r.PeekToken() == '}' {
                r.Discard()
            }
        case '[':
            r.Discard()
            result = append(result, parseArray(r))
            if r.PeekToken() == ']' {
                r.Discard()
            }
        case jlexer.Int:
            result = append(result, r.Int())
        case jlexer.String:
            result = append(result, r.String())
        case jlexer.Null:
            result = append(result, nil)
        case jlexer.True:
            result = append(result, true)
        case jlexer.False:
            result = append(result, false)
        default:
            panic("unrecognizable JSON format")
        }
        if r.PeekToken() == ',' {
            r.Discard()
        } else {
            break
        }
    }
    return result
}

上記のコードでは、JSON 文字列データを表す person という名前の構造体を定義します。で。次に、読みやすい形式で JSON 文字列を作成します。

main 関数では、jlexer.Lexer を使用して JSON データを parseMap 関数に渡し、結果をマップ タイプ変数 result に格納します。最後に、マップ内のキーと値のペアの内容を出力します。

この例では、JSON 文字列をデコードする関数 parseMap を手動で作成します。この関数は、JSONLexer を読み取り、それ自体を再帰的に呼び出して JSON 文字列を解析します。最後に、解析結果のマップ オブジェクトを返します。

easyjson が提供するデコーダーを使用すると、複雑な JSON 構造を簡単に解析できますが、大量のデータをマップにデコードする必要がある場合、解析効率が低下する可能性があります。

結論

JSON データを Golang のマップに変換する方法はたくさんあります。標準ライブラリは、JSON データをマップに直接デコードできる json.Unmarshal を提供します。サードパーティ ライブラリ easyjson はより効率的なソリューションを提供しますが、より多くのセットアップと構成が必要です。

特定の状況に基づいて適切なソリューションを選択してください。単純な JSON 文字列のみをデコードする必要がある場合は、標準ライブラリを使用できます。大量のデータまたはより複雑な構造をデコードする必要がある場合は、サードパーティ ライブラリ easyjson を使用できます。

以上がgolangでJSONデータをマップタイプに変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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