Maison >développement back-end >Golang >Comment préserver la précision Int64 lors de la désorganisation de JSON dans Go ?
Conserver les valeurs Int64 lors de l'analyse de JSON dans Go
Considérez le corps JSON suivant :
{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
Lors de l'utilisation de json .Unmarshal() dans Go pour traiter ce JSON, les valeurs entières 64 bits (id) sont souvent converties à float64 en raison de la nature de l'analyseur JSON de Go. Cela peut être problématique si vous devez préserver leur précision.
Solution 1 : Décodeur personnalisé
Une approche consiste à utiliser un décodeur personnalisé et un type json.Number. json.Number est un type qui représente les littéraux numériques JSON.
import ( "encoding/json" "fmt" "bytes" "strconv" ) func main() { body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`) dat := make(map[string]interface{}) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() if err := d.Decode(&dat); err != nil { panic(err) } tags := dat["tags"].([]interface{}) n := tags[0].(map[string]interface{})["id"].(json.Number) i64, _ := strconv.ParseUint(string(n), 10, 64) fmt.Println(i64) // Prints 4418489049307132905 }
Solution 2 : Structure personnalisée
Une autre option consiste à décoder le JSON dans une structure personnalisée qui correspond spécifiquement à votre format de données.
import ( "encoding/json" "fmt" ) type A struct { Tags []map[string]uint64 // "tags" } func main() { body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`) var a A if err := json.Unmarshal(body, &a); err != nil { panic(err) } fmt.Println(a.Tags[0]["id"]) // Logs 4418489049307132905 }
Dans cette solution, uint64 est utilisé directement dans la structure, garantissant que Les valeurs entières de 64 bits sont conservées.
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!