ホームページ > バックエンド開発 > Golang > Go で指数を使用して JSON 数値をアンマーシャリングする方法

Go で指数を使用して JSON 数値をアンマーシャリングする方法

Patricia Arquette
リリース: 2024-11-15 13:59:03
オリジナル
210 人が閲覧しました

How to Unmarshal JSON Numeric Values with Exponents in Go?

指数を含む数値の JSON アンマーシャル

Golang ユーザーは、JSON 文字列を指数を含む数値を含む Go 構造にアンマーシャルしようとすると問題が発生する可能性があります。デフォルトでは、Go はこれらの値を誤って解釈し、精度が失われます。

問題のデモ

次の Go コードを考えてみましょう:

type Person struct {
    Id   uint64  `json:"id"`
    Name string `json:"name"`
}

func parseJSON(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    // The numeric value with an exponent is lost.
    fmt.Println(person.Id)
}
ログイン後にコピー

{ "id": 1.2E 8, "name": "John" } のような JSON 文字列を指定すると、入力すると、parseJSON 関数は 0 を出力し、指数が無視されていることを示します。

解決策

この問題を解決するには、Id フィールドの型を浮動小数点数に調整します。以下に示すように、float64 などの -point 型:

type Person struct {
    Id   float64 `json:"id"`
    Name string `json:"name"`
}
ログイン後にコピー

この変更により、Go が正しく解釈できるようになります。

フックを使用した代替アプローチ

フィールド タイプの変更が不可能な場合は、「ダミー」を使用する回避策を採用できます。フィールドとカスタムフック。このフックは、「ダミー」フィールドの値を目的の整数型にキャストします。

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}

func parseJSONWithHook(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) {
        person._Id = int64(person.Id)
    }
}
ログイン後にコピー

いずれかのアプローチに従うことで、Go プログラムで指数を含む数値を正常に処理できます。

以上がGo で指数を使用して JSON 数値をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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