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

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

May 11, 2023 pm 04:55 PM
json言語を移動カスタムシリアル化

最新のプログラミング言語では、データ構造とネットワーク送信に対する要件がますます高くなっているため、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 までご連絡ください。
GOプログラミング言語を備えたスケーラブルなシステムを構築しますGOプログラミング言語を備えたスケーラブルなシステムを構築しますApr 25, 2025 am 12:19 AM

goisidealforbuildingscalablessystemsduetoitssimplicity、効率性、およびビルド・インコンカレンシsupport.1)

GOでINIT機能を効果的に使用するためのベストプラクティスGOでINIT機能を効果的に使用するためのベストプラクティスApr 25, 2025 am 12:18 AM

intionSingOrunautomaticallyは()andareuseforstingupenments andinitializingvariables.usemforsimpletasks、回避効果を回避し、測定可能性を測定することを検討します。

GOパッケージのINIT機能の実行順序GOパッケージのINIT機能の実行順序Apr 25, 2025 am 12:14 AM

goinitializeSpackages intheordertheyareimport extionsitions withinitionsiteintheirdefinition ordord、およびfilenamesdetermineTheOordCrossMultiplefiles.thisprocesccanbeandeanded by -dependenciessedieSiesは、このマイレアドカンフレシニティン化の対象となります

Goでカスタムインターフェイスを定義および使用しますGoでカスタムインターフェイスを定義および使用しますApr 25, 2025 am 12:09 AM

custominterfacesingoarecrucialforwritingfficable、maintable、a​​ndtatablecode.theyeNabledeveloveerStofofofovioroverimplementation、拡張、methodsodsignaturesthattypespessmustimment、interfaceforoderueusavelya

GOのモッキングとテストのためにインターフェイスを使用しますGOのモッキングとテストのためにインターフェイスを使用しますApr 25, 2025 am 12:07 AM

シミュレーションとテストにインターフェイスを使用する理由は、インターフェイスにより、実装を指定せずに契約の定義を可能にし、テストをより孤立し、メンテナンスしやすくするためです。 1)インターフェイスの暗黙的な実装により、モックオブジェクトを簡単に作成できます。これにより、テストの実際の実装を置き換えることができます。 2)インターフェイスを使用すると、ユニットテストでのサービスの実際の実装を簡単に置き換えることができ、テストの複雑さと時間を短縮できます。 3)インターフェイスによって提供される柔軟性により、さまざまなテストケースのシミュレートされた動作の変更が可能になります。 4)インターフェイスは、テスト可能なコードを最初から設計し、コードのモジュール性と保守性を向上させるのに役立ちます。

GOのパッケージ初期化にinitを使用しますGOのパッケージ初期化にinitを使用しますApr 24, 2025 pm 06:25 PM

Goでは、init関数はパッケージの初期化に使用されます。 1)init関数は、パッケージの初期化時に自動的に呼び出され、グローバル変数の初期化、接続の設定、構成ファイルの読み込みに適しています。 2)ファイルの順序で実行できる複数のinit関数がある場合があります。 3)それを使用する場合、実行順序、テストの難易度、パフォーマンスへの影響を考慮する必要があります。 4)副作用を減らし、依存関係の注入を使用し、初期化を遅延させることをお勧めします。

GoのSelectステートメント:マルチプレックスコンカレント操作GoのSelectステートメント:マルチプレックスコンカレント操作Apr 24, 2025 pm 05:21 PM

go'sselectStatementStreamLinesConcurrentProgrambyMultipLexIngoperations.1)Itallow swaitingonMultipleChanneloperations、実行、exectingThefirstreadyone.2)

Go:Context and Waitgroupsの高度な並行性テクニックGo:Context and Waitgroupsの高度な並行性テクニックApr 24, 2025 pm 05:09 PM

コンテキストアンドウェイトグループは、フォーマネングに焦点を合わせており、contextAllowsingSignalingCancellationAndDeadlinesAcrossapiboundariesを採用し、GoroutinesscanSclacefly.2)WaitGroupssynchronizeGoroutines、Allcompletebebroproproproproproproprotinesを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール