Go で指数を含む JSON 数値を処理する方法は?

Susan Sarandon
リリース: 2024-11-17 08:03:03
オリジナル
273 人が閲覧しました

How to Handle JSON Numerals with Exponents in Go?

Go で指数を含む JSON 数値をデコードする

JSON データを Go 構造にアンマーシャリングする場合、指数を含む数値はゼロとして誤って解釈されることがよくあります。この問題は、構造体のターゲット フィールドが整数型として宣言されている場合に発生します。

この問題に対処するには、次の手順に従います。

  1. フィールドの型を変更します。 > 指数付き数値を格納するフィールドの型を uint64 から float32 または float64 に変更します。例:
type Person struct {
    Id   float32  `json:"id"`
    Name string `json:"name"`
}
ログイン後にコピー
  1. JSON をアンマーシャリングします: json.Unmarshal 関数を使用して、通常どおりアンマーシャリング操作を実行します。指数付きの数値が正しく解釈されるようになりました。

例を示します:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

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

func main() {

    // Create the JSON string.
    var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)

    // Unmarshal the JSON to a proper struct.
    var f Person
    json.Unmarshal(b, &f)

    // Print the person.
    fmt.Println(f)

    // Unmarshal the struct to JSON.
    result, _ := json.Marshal(f)

    // Print the JSON.
    os.Stdout.Write(result)
}
ログイン後にコピー

これは出力します:

{1.2e+08 Fernando}
{"id":1.2e+08,"Name":"Fernando"}
ログイン後にコピー

代替アプローチ:

フィールドに整数型を使用する必要がある場合は、float64 型の「ダミー」フィールドを使用して、指数付きの数値をキャプチャできます。次に、フックを使用して値を実際の整数型にキャストします。

次に例を示します:

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

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)
}
ログイン後にコピー

これにより、次の出力が行われます:

1.2e+08
{Name:Fernando Id:120000000}
ログイン後にコピー

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

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