From c6fc4daa96392f862a3a5b0a40b22caca924e68e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:22 +0300 Subject: [PATCH] json2: fix decoder cannot convert float to u64 (fixes #25426) --- vlib/x/json2/decode.v | 1 + .../decode_float_to_64bit_integer_test.v | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 vlib/x/json2/tests/decode_float_to_64bit_integer_test.v diff --git a/vlib/x/json2/decode.v b/vlib/x/json2/decode.v index 02e3905dd..6be7483a3 100644 --- a/vlib/x/json2/decode.v +++ b/vlib/x/json2/decode.v @@ -1121,6 +1121,7 @@ fn has_exponent_number_syntax(str string) bool { return false } +<<<<<<< HEAD fn scientific_number_to_integer_string(str string) !string { if !has_exponent_number_syntax(str) { return str diff --git a/vlib/x/json2/tests/decode_float_to_64bit_integer_test.v b/vlib/x/json2/tests/decode_float_to_64bit_integer_test.v new file mode 100644 index 000000000..6076763e4 --- /dev/null +++ b/vlib/x/json2/tests/decode_float_to_64bit_integer_test.v @@ -0,0 +1,21 @@ +import json as old_json +import x.json2 as json + +struct Legacy64BitNumbers { + signed i64 + unsigned u64 +} + +fn test_decode_float_numbers_into_64bit_integer_fields_matches_json_module() { + payload := '{"signed": -1756811041916.0, "unsigned": 1756811041916.0}' + expected := old_json.decode(Legacy64BitNumbers, payload)! + actual := json.decode[Legacy64BitNumbers](payload)! + assert actual == expected +} + +fn test_decode_float_strings_into_64bit_integer_fields_in_default_mode() { + payload := '{"signed": "-1756811041916.0", "unsigned": "1756811041916.0"}' + actual := json.decode[Legacy64BitNumbers](payload)! + assert actual.signed == i64(-1756811041916) + assert actual.unsigned == u64(1756811041916) +} -- 2.39.5