首頁  >  文章  >  後端開發  >  如何在 Go 中處理帶指數的 JSON 數字?

如何在 Go 中處理帶指數的 JSON 數字?

Susan Sarandon
Susan Sarandon原創
2024-11-17 08:03:03269瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn