Heim  >  Artikel  >  Backend-Entwicklung  >  Die JSON-Nummer wurde nach dem Unmarshaling für die Schnittstelle abgeschnitten

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

PHPz
PHPznach vorne
2024-02-10 09:48:08588Durchsuche

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}

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 {

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen