Merge pull request #108831 from aaronfranke/json-pass-full-precision

Fix internal JSON stringify not preserving p_full_precision
This commit is contained in:
Thaddeus Crews
2025-07-22 11:20:15 -05:00
3 changed files with 17 additions and 9 deletions

View File

@ -73,18 +73,18 @@ void JSON::_stringify(String &r_result, const Variant &p_var, const String &p_in
r_result += itos(p_var);
return;
case Variant::FLOAT: {
double num = p_var;
const double num = p_var;
// Only for exactly 0. If we have approximately 0 let the user decide how much
// precision they want.
if (num == double(0)) {
if (num == double(0.0)) {
r_result += "0.0";
return;
}
double magnitude = std::log10(Math::abs(num));
int total_digits = p_full_precision ? 17 : 14;
int precision = MAX(1, total_digits - (int)Math::floor(magnitude));
const double magnitude = std::log10(Math::abs(num));
const int total_digits = p_full_precision ? 17 : 14;
const int precision = MAX(1, total_digits - (int)Math::floor(magnitude));
r_result += String::num(num, precision);
return;
@ -120,7 +120,7 @@ void JSON::_stringify(String &r_result, const Variant &p_var, const String &p_in
r_result += end_statement;
}
_add_indent(r_result, p_indent, p_cur_indent + 1);
_stringify(r_result, var, p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
_stringify(r_result, var, p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
}
r_result += end_statement;
_add_indent(r_result, p_indent, p_cur_indent);
@ -154,9 +154,9 @@ void JSON::_stringify(String &r_result, const Variant &p_var, const String &p_in
r_result += end_statement;
}
_add_indent(r_result, p_indent, p_cur_indent + 1);
_stringify(r_result, String(key), p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
_stringify(r_result, String(key), p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
r_result += colon;
_stringify(r_result, d[key], p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
_stringify(r_result, d[key], p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
}
r_result += end_statement;

View File

@ -72,7 +72,7 @@ class JSON : public Resource {
static const char *tk_name[];
static void _add_indent(String &r_result, const String &p_indent, int p_size);
static void _stringify(String &r_result, const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision = false);
static void _stringify(String &r_result, const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision);
static Error _get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str);
static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str);
static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str);