Maison >développement back-end >Golang >Comment puis-je conserver les types de données entiers et flottants lors de l'analyse de JSON dans Go ?

Comment puis-je conserver les types de données entiers et flottants lors de l'analyse de JSON dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-02 09:02:14284parcourir

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

Préservation des types de données dans l'analyse JSON : entiers sous forme d'entiers, flottants sous forme de flottants

Dans Golang, analyse des enregistrements JSON qui contiennent un mélange d'entiers et les valeurs flottantes nécessitent une manipulation minutieuse pour conserver les types de données d'origine. Cependant, l'implémentation actuelle utilisant le package encoding/json analyse tous les nombres comme des nombres flottants, ce qui peut entraîner des conflits de types dans le stockage des données.

Pour résoudre ce problème, nous pouvons utiliser plusieurs approches :

1. Gestion des valeurs JSON personnalisées :

Nous pouvons exploiter le mécanisme Go pour les valeurs JSON personnalisées afin d'identifier et de gérer les entiers et les flottants de manière appropriée.

package main

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)
    }
}

2. json.Number Type :

Go fournit le type json.Number spécialement conçu pour gérer les numéros JSON. Cela nous permet d'analyser les nombres sous forme de flottants, puis d'extraire des entiers ou des flottants selon les besoins.

package main

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)
    }
}

Ces approches offrent des moyens flexibles d'analyser et de conserver les valeurs entières et flottantes dans JSON, garantissant ainsi une représentation correcte des données lors du traitement ultérieur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn