JSON number truncated after unmarshaling to interface

PHPz
Release: 2024-02-10 09:48:08
forward
552 people have browsed it

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}
Copy after login

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 {
Copy after login

See//m.sbmmt.com/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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!