Home  >  Article  >  Backend Development  >  JSON number truncated after unmarshaling to interface

JSON number truncated after unmarshaling to interface

PHPz
PHPzforward
2024-02-10 09:48:08563browse

JSON 数字在解组到接口后被截断

During the development process, we often use JSON format to transmit data. However, sometimes we find that after unmarshalling the JSON data into the interface, the numeric data is truncated. This is a very common question, but one that is easily overlooked. In this article, PHP editor Zimo will introduce in detail the causes of this problem and how to avoid and solve this problem to ensure the integrity and accuracy of digital data.

Question content

So I have a json with many fields and I'm looping through it as suggested How to change json keys efficiently Remove some keys that I don't need. But after deletion, the original values ​​of the existing json changed, some of them seemed to be floats, I made a demo to show it.

How to change this behavior? Is interface{} causing the problem? Why is 1684366653200744506 truncated to 1684366653200744400?

Thanks!

https://go.dev/play/p/x2auwqwb2fl

For reference, the output json is changed to 1684366653200744400

2009/11/10 23:00:00 1684366653200744448.000000
2009/11/10 23:00:00 map[timestamp:1.6843666532007444e+18]
2009/11/10 23:00:00 json Marshal from maps of key string and value interface to batch json for insert to DB
2009/11/10 23:00:00 {"timestamp":1684366653200744400}

Workaround

This is because by default, the encoding/json package stores float64 in the interface value of a json number. See json.unmarshal:

To unmarshal json into an interface value, unmarshal stores one of the following in the interface value:

  • bool, for json boolean value
  • float64 for json numbers
  • ...

You can create a decoder and call (*decoder).usenumberChange the behavior:

jsonBatch := `{"timestamp":1684366653200744506, "todelete":"string value or boolean value"}`
dec := json.NewDecoder(strings.NewReader(jsonBatch))
dec.UseNumber()
var i interface{}
if err := dec.Decode(&i); err != nil {

Seehttps://www.php.cn/link/3a6c2c9231df58107434b942fa600b22.

The above is the detailed content of JSON number truncated after unmarshaling to interface. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete