ホームページ  >  記事  >  バックエンド開発  >  Go でカスタム JSON シリアル化を使用するにはどうすればよいですか?

Go でカスタム JSON シリアル化を使用するにはどうすればよいですか?

王林
王林オリジナル
2023-05-11 16:55:421346ブラウズ

最新のプログラミング言語では、データ構造とネットワーク送信に対する要件がますます高くなっているため、JSON 形式も重要なデータ交換形式になっています。 JSON はより効率的にデータを送信でき、Go 言語はその高性能とシンプルなアプリケーション インターフェイスによりますます人気が高まっています。 Go では、JSON シリアル化をカスタマイズして、データ送信のニーズをより適切に満たすことができます。この記事では、Go でカスタム JSON シリアル化を使用する方法について説明します。

1. JSON シリアル化とは何ですか?

JSON シリアル化とは、オブジェクトを JSON 形式の文字列に変換し、ネットワーク送信中に他のサービスまたはクライアントに送信して、オブジェクトを正常に読み取って使用できるようにすることを指します。シリアル化された JSON 文字列では、各属性名が文字列に変換され、各値が JSON 内の対応する型に変換されて、異なる言語間での共通データが保証されます。

2. Go での JSON シリアル化

Go 言語では、標準ライブラリの「encoding/json」を使用して JSON シリアル化を実現できます。データ構造が一般的な構造と個別の値の場合、次に示すように、標準ライブラリの Marshal 関数を直接使用して、対応する JSON 文字列に変換できます。

type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

func main() {
    user := User{"Amy", "123456"}
    jsonStr, err := json.Marshal(user)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(jsonStr))
}

出力される JSON 文字列は次のとおりです。

{"username":"Amy","password":"123456"}

3. カスタム JSON シリアル化

Go 言語では、MarshalJSON メソッドと UnmarshalJSON メソッドを実装することで JSON シリアル化をカスタマイズできます。 MarshalJSON メソッドは構造または型を JSON 文字列に変換するために使用されますが、UnmarshalJSON は JSON 文字列を対応する構造または型に変換できます。

カスタム JSON シリアル化を実装する前に、いくつかの構造タグを理解する必要があります:

  1. json: 構造を定義するときは、フィールドの前に 'json:" を追加できます。custom_name"' JSON 文字列をシリアル化するときにフィールドの名前を定義します。
  2. omitempty: フィールド値が空でない場合、フィールドはシリアル化中に含まれ、フィールドが空の場合、フィールドは含まれません。

次に、給与を例としてカスタム JSON シリアル化を実装します。

type Salary struct {
    Basic int `json:"basic,omitempty"`
    Bonus int `json:"bonus,omitempty"`
}

func (s Salary) MarshalJSON() ([]byte, error) {
    var result string
    if s.Bonus != 0 {
        result = fmt.Sprintf(""basic":%d,"bonus":%d", s.Basic, s.Bonus)
    } else {
        result = fmt.Sprintf(""basic":%d", s.Basic)
    }
    return []byte("{" + result + "}"), nil
}

func main() {
    salary := Salary{
        Basic:  10000,
        Bonus:  5000,
    }
    jsonStr, err := json.Marshal(salary)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(jsonStr))
}

上記のコードを実行すると、出力される JSON 文字列は次のようになります:

{"basic":10000,"bonus":5000}

ここでは、Marsha にカスタム MarshalJSON メソッドを実装します。Bonus フィールドが 0 でない場合にのみ、値が出力されます。のみ; 0 の場合、フィールドは出力されません。

4. カスタマイズされた JSON 書式設定

Go 言語では、MarshalText メソッドと UnmarshalText メソッドを実装することで JSON 書式設定をカスタマイズすることもできます。 MarshalText メソッドは、構造体または型を []byte 形式のテキストに変換するために使用され、UnmarshalText は、[]byte 形式のテキストを対応する構造体または型に変換できます。

日付を例として、「2022-09-21」のような形式を出力するように JSON 書式設定関数をカスタマイズします。

type Date struct {
    time.Time
}

func (d Date) MarshalText() ([]byte, error) {
    return []byte(d.Time.Format("2006-01-02")), nil
}

func (d *Date) UnmarshalText(text []byte) error {
    parse, err := time.Parse("2006-01-02", string(text))
    if err != nil {
        return err
    }
    d.Time = parse
    return nil
}

func main() {
    date := Date{time.Now()}
    jsonStr, err := json.Marshal(date)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(jsonStr))

    var newDate Date
    err = json.Unmarshal([]byte(""2022-09-21""), &newDate)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(newDate.Time)
}

上記のコードを実行すると、出力される JSON 文字列は次のようになります:

"2022-09-21"
2022-09-21 00:00:00 +0000 UTC

上記の例からわかるように、JSON のシリアル化と逆シリアル化をカスタマイズする場合は、JSON のシリアル化の原則とを理解する必要があります。標準ライブラリの実装は実際の開発に柔軟に適用できます。同時に、独自のオブジェクトの要件を満たす JSON 形式メソッドを定義することもできます。これにより、さまざまなシナリオでのデータ送信のニーズをより適切に満たすための基本的なツールとサポートが提供されます。

以上がGo でカスタム JSON シリアル化を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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