ホームページ >バックエンド開発 >Golang >Go で匿名メンバーを含む JSON 構造体をフラット化するにはどうすればよいですか?

Go で匿名メンバーを含む JSON 構造体をフラット化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 05:20:30326ブラウズ

How Can I Flatten JSON Structs with Anonymous Members in Go?

Go で匿名メンバーを含むマーシャルされた JSON 構造体を平坦化する

提供されたコードは、匿名メンバーを含む構造体を、カスタム " を使用して平坦化された JSON オブジェクトに変換しようとします。 _リンク」フィールド。ただし、匿名メンバー「Anything」は名前付きフィールドとして扱われ、望ましくない JSON 構造が生成されます。

JSON マーシャリングにおける匿名メンバーの処理について

Go の JSON マーシャラー匿名の構造体フィールドを、エクスポートされた内部フィールドが外部構造体のフィールドであるかのように扱います。この動作は、JSON タグに名前を指定することでオーバーライドできますが、匿名メンバーをフラット化するための明示的なメカニズムはありません。

リフレクションを使用した解決策

目的を達成するには平坦化のために、以下のソリューションはリフレクト パッケージを利用します。構造体のフィールドを反復処理することで、新しいフィールドを導入せずに元のオブジェクトの構造を保持するマップ[文字列]インターフェース{}を作成できます。

<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) {
    links := make(map[string]string)
    out := make(map[string]interface{})
    subjectValue := reflect.Indirect(reflect.ValueOf(subject))
    subjectType := subjectValue.Type()
    for i := 0; i < subjectType.NumField(); i++ {
        field := subjectType.Field(i)
        name := subjectType.Field(i).Name
        out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface()
    }
    ...
}</code>

使用例

次の例は、ユーザーおよびセッション構造体のフラット化された JSON 出力を示しています。

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type User struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

type Session struct {
    Id     int `json:"id"`
    UserId int `json:"userId"`
}

func MarshalHateoas(subject interface{}) ([]byte, error) {
    ...  
}

func main() {
    u := &User{123, "James Dean"}
    s := &Session{456, 123}

    json, err := MarshalHateoas(u)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("User JSON:")
        fmt.Println(string(json))
    }

    json, err = MarshalHateoas(s)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("Session JSON:")
        fmt.Println(string(json))
    }
}</code>

JSON 出力:

User JSON:
{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}
Session JSON:
{
    "id": 456,
    "userId": 123,
    "_links": {
        "self": "http://session/456"
    }
}

以上がGo で匿名メンバーを含む JSON 構造体をフラット化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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