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

Go で数値の JSON アンマーシャリングで指数を処理する方法

Mary-Kate Olsen
リリース: 2024-11-23 07:04:23
オリジナル
748 人が閲覧しました

How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?

Golang Json Unmarshal Numeric with Exponent

JSON 文字列を指数付きの数値を含む構造体にアンマーシャリングする場合、指数がは一貫して 0 に切り捨てられます。この問題は、 struct フィールドが JSON のデータ型と一致しません。

この例では、person struct の Id フィールドは、符号なし 64 ビット整数を表す uint64 として定義されています。ただし、JSON 文字列の値は科学表記法 (1.2E 8) の 10 進数です。

Go は指数付き 10 進数を符号なし 64 ビット整数に自動的に変換できないため、結果は次のように切り捨てられます。 0.

解決方法問題

この問題を解決するには、JSON 文字列のデータ型と一致するように ID フィールドの型を変更できます。この場合、数値は 10 進数であるため、float32 または float64 を使用できます。

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

型を float32 または float64 に更新することで、Go は指数を含む数値を正しく解釈して割り当てることができるようになりました。

Id の元の整数型を保持したい場合は、次のようにすることもできます。カスタム JSON アンマーシャラー フックを使用します。このフックは、フィールドに割り当てる前に浮動小数点値を整数に変換できます。

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

func (p *Person) UnmarshalJSON(b []byte) error {
    type Alias Person
    var a Alias

    if err := json.Unmarshal(b, &a); err != nil {
        return err
    }

    // Convert the float64 Id to int64
    p.Id = int64(a.Id)

    return nil
}
ログイン後にコピー

カスタム アンマーシャラーを使用すると、JSON 文字列内の指数を含む数値が正しく変換され、次の値に割り当てられます。 Person 構造体の Id フィールド。

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

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