diff --git a/src/json.hpp b/src/json.hpp index a52d2c24..5f47d158 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -9121,6 +9121,13 @@ basic_json_parser_66: { // parse with strtod result.m_value.number_float = str_to_float_t(static_cast(nullptr), NULL); + + // replace infinity and NAN by null + if (not std::isfinite(result.m_value.number_float)) + { + type = value_t::null; + result.m_value = basic_json::json_value(); + } } // save the type diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 476903cd..627c9185 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -8270,6 +8270,13 @@ class basic_json { // parse with strtod result.m_value.number_float = str_to_float_t(static_cast(nullptr), NULL); + + // replace infinity and NAN by null + if (not std::isfinite(result.m_value.number_float)) + { + type = value_t::null; + result.m_value = basic_json::json_value(); + } } // save the type diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index 16d9351a..2c3964b6 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -489,4 +489,10 @@ TEST_CASE("regression tests") j["/this/that/2"_json_pointer] = 27; CHECK(j == json({{"this", {{"that", {nullptr, nullptr, 27}}}}})); } + + SECTION("issue #329 - serialized value not always can be parsed") + { + json j = json::parse("22e2222"); + CHECK(j == json()); + } }