ホームページ > バックエンド開発 > Golang > Go で SQL NULL 値とその JSON 表現を効率的に処理する方法は?

Go で SQL NULL 値とその JSON 表現を効率的に処理する方法は?

Mary-Kate Olsen
リリース: 2025-01-03 06:22:39
オリジナル
265 人が閲覧しました

How to Efficiently Handle SQL NULL Values and Their JSON Representation in Go?

効率的な方法で SQL NULL 値と JSON を操作する

この記事では、Go で SQL NULL 値を操作する際のジレンマと、その処理方法について説明します。 JSON 表現を効果的に表現します。

int64 や string などの Go 型を利用する場合、null 値を直接指定することはできません。保管されています。ただし、この目的のために sql.NullInt64 および sql.NullString を使用できます。ただし、これらの型が構造体に埋め込まれ、json パッケージを使用して JSON に変換されると、結果の形式は、通常の int64 および string 型を使用したときに得られる形式とは異なります。

この相違は、次の JSON 表現が原因で発生します。 sql.Null*** 型には、本質的に構造体そのものであるため、追加のレベルが含まれています。その結果、目的の JSON 形式を実現するための回避策が必要になります。

SQL データベースでの NULL 値の使用を放棄する代わりに、実行可能な解決策の 1 つは、JSON を実装するカスタム タイプを作成することです。 Marshaller インターフェイスと json.Unmarshaler インターフェイス。 sql.NullInt64 型を埋め込むことで、JSON 処理を制御しながら SQL メソッドを保持します。このアプローチを示す例は次のとおりです。

type JsonNullInt64 struct {
    sql.NullInt64
}

func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
    if v.Valid {
        return json.Marshal(v.Int64)
    } else {
        return json.Marshal(nil)
    }
}

func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
    // Unmarshalling into a pointer will let us detect null
    var x *int64
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if x != nil {
        v.Valid = true
        v.Int64 = *x
    } else {
        v.Valid = false
    }
    return nil
}
ログイン後にコピー

sql.NullInt64 の代わりにこのカスタム型を利用することにより、JSON 表現は目的の形式と一致します。

このソリューションをデモンストレーションするには、次のようにします。 Go プレイグラウンドで次のコードを実行します。

func main() {
    type Person struct {
        Age     int64                `json:"age"`
        AgeJson JsonNullInt64        `json:"ageJson"`
    }
    p := Person{
        Age:     10,
        AgeJson: sql.NullInt64{Int64: 0, Valid: true},
    }
    b, _ := json.Marshal(p)
    fmt.Println(string(b))
}
ログイン後にコピー

出力は次のようになります。以下:

{"age":10,"ageJson":10}
ログイン後にコピー

このアプローチにより、SQL と JSON の両方で NULL 値をシームレスに処理でき、データ表現の一貫性が維持されます。

以上がGo で SQL NULL 値とその JSON 表現を効率的に処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート