ホームページ > バックエンド開発 > Golang > 指数を含む数値に遭遇すると Golang JSON アンマーシャル エラーが発生するのはなぜですか?

指数を含む数値に遭遇すると Golang JSON アンマーシャル エラーが発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-15 19:21:02
オリジナル
734 人が閲覧しました

Why Does Golang JSON Unmarshal Error When Encountering Numeric Values with Exponents?

Golang JSON アンマーシャル エラー: 指数を持つ数値が 0 を返す

JSON データを Go 構造体にアンマーシャルしようとしているときに、ユーザーがエラーに遭遇しました。指数付きの数値が一貫して 0 として解釈される問題。この動作は、予期される型と実際の値の不一致に起因します。

たとえば、{"id": 1.2e 8 のような JSON 文字列の場合、"Name": "Fernando"} は、uint64 型の ID フィールドを持つ構造体にアンマーシャリングされ、結果の ID は 0 になります。

Solution

この問題を解決するには、構造体のフィールドの型が JSON 文字列のデータの型と一致していることを確認してください。この場合、指数が使用されるため、Id フィールドは float32 または float64 のような浮動小数点型として定義する必要があります。

代替解決策

予期された型は JSON 数値形式と互換性がありません。回避策を実装できます。目的の型の「ダミー」フィールドを追加すると、フックを使用して値を実際に期待される型にキャストできます。

例:

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}
ログイン後にコピー
JSON データをアンマーシャリングした後Person 構造体に条件付きチェックを追加して、ID フィールドを int64 にキャストできます。

var f Person
var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`)
_ = json.Unmarshal(b, &f)

if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) {
    fmt.Println(f.Id)
    f._Id = int64(f.Id)
}
ログイン後にコピー
このハックなアプローチにより、浮動小数点 ID フィールドを目的の int64 型に変換できます。

以上が指数を含む数値に遭遇すると Golang JSON アンマーシャル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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