Bagaimanakah Saya Boleh Mengekalkan Jenis Data Apabila Menghuraikan JSON dalam Go?

DDD
Lepaskan: 2024-11-25 02:46:10
asal
669 orang telah melayarinya

How Can I Preserve Data Types When Parsing JSON in Go?

Memelihara Jenis Data dalam Penghuraian JSON

Satu cabaran yang dihadapi semasa menghuraikan data JSON dalam Golang ialah penukaran automatik nilai angka kepada terapung. Ini boleh menyebabkan ketidakkonsistenan dengan data asal, terutamanya apabila berurusan dengan nilai integer.

Untuk menangani isu ini, terdapat beberapa teknik untuk mengekalkan jenis data semasa penghuraian JSON.

Tersuai Nilai JSON

Satu pendekatan ialah menggunakan mekanisme nilai JSON tersuai yang disediakan oleh Go. Ini melibatkan mencipta jenis tersuai yang melaksanakan antara muka json.Marshaler dan json.Unmarshaler. Dengan mengatasi kaedah MarshalJSON dan UnmarshalJSON, anda boleh mengawal cara nilai berangka dikendalikan semasa bersiri dan penyahserikatan.

Go json.Number

Pilihan lain ialah menggunakan json .Jenis nombor yang diperkenalkan dalam Go 1.8. Secara lalai, nilai berangka dalam JSON dihuraikan sebagai float64. Walau bagaimanapun, dengan menggunakan json.Number dan memanggil kaedah Int64 atau Float64, anda boleh menukar nombor secara eksplisit masing-masing kepada nilai integer atau titik terapung.

Contoh Pelaksanaan

package main

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

type MyJSONNumber struct {
    json.Number
}

func (mn *MyJSONNumber) MarshalJSON() ([]byte, error) {
    if n, err := strconv.Atoi(string(mn.Number)); err == nil {
        return []byte(strconv.Itoa(n)), nil
    }
    return []byte(mn.Number), nil
}

func (mn *MyJSONNumber) UnmarshalJSON(b []byte) error {
    if n, err := strconv.Atoi(string(b)); err == nil {
        mn.Number = strconv.Itoa(n)
        return nil
    }
    mn.Number = string(b)
    return nil
}

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)
        jnum := MyJSONNumber{json.Number(s)}
        n, err := jnum.Int64()
        if err == nil {
            parsed[key] = n
            continue
        }
        f, err := jnum.Float64()
        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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Jenis Data Apabila Menghuraikan JSON dalam Go?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan