Bagaimanakah Saya Boleh Menghuraikan Integer dan Terapung Dengan Tepat daripada JSON di Golang?

Linda Hamilton
Lepaskan: 2024-11-24 09:12:10
asal
352 orang telah melayarinya

How Can I Parse Integers and Floats Accurately from JSON in Golang?

Menghuraikan Integer sebagai Integer dan Terapung sebagai Terapung dalam JSON Menggunakan Golang

Dalam aplikasi Golang yang menerima aliran rekod JSON untuk dimajukan ke stor data (InfluxDB), adalah penting untuk mengekalkan jenis data asal integer dan nilai apungan kepada elakkan konflik jenis dan pastikan operasi tulis berjaya. Walaupun penghurai Ruby JSON dengan mudah melaksanakan tugas ini, pakej pengekodan/json di Golang pada mulanya menghuraikan semua nombor sebagai terapung, yang berpotensi membawa kepada kegagalan taip dan penulisan.

Penyelesaian Menggunakan Nilai JSON Tersuai

Untuk meniru gelagat penghurai Ruby JSON, satu pendekatan ialah menggunakan Go generik mekanisme untuk nilai JSON tersuai. Dalam kaedah ini, nombor JSON diwakili sebagai tatasusunan bait (json.RawMessage) dan dihuraikan menggunakan strconv.ParseInt dan strconv.ParseFloat. Ini membolehkan penukaran integer dan terapung yang tepat:

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

func main() {
    str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}`
    var raw map[string]json.RawMessage
    err := json.Unmarshal([]byte(str), &raw)
    if err != nil {
        panic(err)
    }
    parsed := make(map[string]interface{}, len(raw))
    for key, val := range raw {
        s := string(val)
        i, err := strconv.ParseInt(s, 10, 64)
        if err == nil {
            parsed[key] = i
            continue
        }
        f, err := strconv.ParseFloat(s, 64)
        if err == nil {
            parsed[key] = f
            continue
        }
        var v interface{}
        err = json.Unmarshal(val, &v)
        if err == nil {
            parsed[key] = v
            continue
        }
        parsed[key] = val
    }
    for key, val := range parsed {
        fmt.Printf("%T: %v %v\n", val, key, val)
    }
}
Salin selepas log masuk

Output:

int64: a 123 
float64: b 12.3 
string: c 123 
string: d 12.3 
bool: e true 
Salin selepas log masuk

Menggunakan json.Nombor Jenis

Pendekatan alternatif melibatkan penggunaan jenis Go json.Number, yang membolehkan penghuraian yang cekap bagi kedua-dua integer dan terapung terus daripada data JSON:

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

func main() {
    str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}`
    var parsed map[string]interface{}
    d := json.NewDecoder(strings.NewReader(str))
    d.UseNumber()
    err := d.Decode(&parsed)
    if err != nil {
        panic(err)
    }
    for key, val := range parsed {
        n, ok := val.(json.Number)
        if !ok {
            continue
        }
        if i, err := n.Int64(); err == nil {
            parsed[key] = i
            continue
        }
        if f, err := n.Float64(); err == nil {
            parsed[key] = f
            continue
        }
    }
    for key, val := range parsed {
        fmt.Printf("%T: %v %v\n", val, key, val)
    }
}
Salin selepas log masuk

Output:

int64: a 123
float64: b 12.3
string: c 123
string: d 12.3
bool: e true
Salin selepas log masuk

Kaedah ini menyediakan penyelesaian yang berkesan untuk mengekalkan jenis data asal integer dan terapung semasa Penghuraian JSON dalam Golang, memastikan pengendalian data yang tepat dan boleh dipercayai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan Integer dan Terapung Dengan Tepat daripada JSON di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan