From 847423fe42430e9760e49f58e4ca6a57ed0d1341 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 28 Aug 2023 14:57:35 +0200 Subject: [PATCH] JSON import: reduce number of significant decimal digits when parsing id.version field (fixes #3863, reworks previous commit) --- src/iso19111/io.cpp | 2 +- src/iso19111/metadata.cpp | 10 ++-------- src/proj_json_streaming_writer.cpp | 5 +++++ src/proj_json_streaming_writer.hpp | 1 + 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 3422b8b45f..75b4a15978 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -5981,7 +5981,7 @@ IdentifierNNPtr JSONParser::buildId(const json &j, bool removeInverseOf) { static_cast(dblVersion) == dblVersion) { version = internal::toString(static_cast(dblVersion)); } else { - version = internal::toString(dblVersion); + version = internal::toString(dblVersion, /*precision=*/15); } } else { throw ParsingException("Unexpected type for value of \"version\""); diff --git a/src/iso19111/metadata.cpp b/src/iso19111/metadata.cpp index ffccf2e357..4dd5129e63 100644 --- a/src/iso19111/metadata.cpp +++ b/src/iso19111/metadata.cpp @@ -1142,15 +1142,9 @@ void Identifier::_exportToJSON(JSONFormatter *formatter) const { if (!l_version.empty()) { writer->AddObjKey("version"); bool isDouble = false; - const double dblVersion = c_locale_stod(l_version, isDouble); + (void)c_locale_stod(l_version, isDouble); if (isDouble) { - if (dblVersion >= std::numeric_limits::min() && - dblVersion <= std::numeric_limits::max() && - static_cast(dblVersion) == dblVersion) { - writer->Add(static_cast(dblVersion)); - } else { - writer->Add(dblVersion, /*precision=*/15); - } + writer->AddUnquoted(l_version.c_str()); } else { writer->Add(l_version); } diff --git a/src/proj_json_streaming_writer.cpp b/src/proj_json_streaming_writer.cpp index 5263568924..a60522251b 100644 --- a/src/proj_json_streaming_writer.cpp +++ b/src/proj_json_streaming_writer.cpp @@ -219,6 +219,11 @@ void CPLJSonStreamingWriter::Add(const char *pszStr) { Print(FormatString(pszStr)); } +void CPLJSonStreamingWriter::AddUnquoted(const char *pszStr) { + EmitCommaIfNeeded(); + Print(pszStr); +} + void CPLJSonStreamingWriter::Add(GIntBig nVal) { EmitCommaIfNeeded(); Print(CPLSPrintf(CPL_FRMT_GIB, nVal)); diff --git a/src/proj_json_streaming_writer.hpp b/src/proj_json_streaming_writer.hpp index 796156640d..076d21f3b7 100644 --- a/src/proj_json_streaming_writer.hpp +++ b/src/proj_json_streaming_writer.hpp @@ -86,6 +86,7 @@ class CPL_DLL CPLJSonStreamingWriter { void Add(const std::string &str); void Add(const char *pszStr); + void AddUnquoted(const char *pszStr); void Add(bool bVal); void Add(int nVal) { Add(static_cast(nVal)); } void Add(unsigned int nVal) { Add(static_cast(nVal)); }