Die JSON-Nummer wurde nach dem Unmarshaling für die Schnittstelle abgeschnitten

PHPz
Freigeben: 2024-02-10 09:48:08
nach vorne
566 Leute haben es durchsucht

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

Während des Entwicklungsprozesses verwenden wir häufig das JSON-Format zur Datenübertragung. Manchmal stellen wir jedoch fest, dass nach dem Unmarshalling der JSON-Daten in die Schnittstelle die numerischen Daten abgeschnitten werden. Dies ist eine sehr häufige Frage, die jedoch leicht übersehen wird. In diesem Artikel stellt der PHP-Editor Zimo ausführlich die Ursachen dieses Problems vor und erläutert, wie man es vermeidet und löst, um die Integrität und Genauigkeit digitaler Daten sicherzustellen.

Frageninhalt

Ich habe also einen JSON mit vielen Feldern und durchlaufe ihn wie vorgeschlagen So ändern Sie JSON-Schlüssel effizient Entfernen Sie einige Schlüssel, die ich nicht benötige. Aber nach dem Löschen änderten sich die ursprünglichen Werte des vorhandenen JSON, einige davon schienen Floats zu sein, ich habe eine Demo erstellt, um es zu zeigen.

Wie kann man dieses Verhalten ändern? Ja interface{} 导致了该问题吗?为什么1684366653200744506被截断为1684366653200744400?

Danke!

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

Als Referenz: Der Ausgabe-JSON ändert sich in 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}
Nach dem Login kopieren

Workaround

Das liegt daran, dass encoding/json 包将 float64 standardmäßig im Schnittstellenwert einer JSON-Nummer gespeichert ist. Siehe json.unmarshal:

Um JSON in einen Schnittstellenwert zu entmarshalieren, speichert unmarshal einen der folgenden Werte im Schnittstellenwert:

  • bool, für booleschen JSON-Wert
  • float64 für JSON-Nummern
  • ...

Sie können einen Decoder erstellen und (*decoder).usenumber aufrufen, um das Verhalten zu ändern:

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 {
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonDie JSON-Nummer wurde nach dem Unmarshaling für die Schnittstelle abgeschnitten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!