🚑 fix for #1021
This commit is contained in:
parent
d2dd27dc3b
commit
a9baab76c2
4 changed files with 108 additions and 12 deletions
|
@ -301,6 +301,7 @@ Exceptions have ids 5xx.
|
||||||
name / id | example message | description
|
name / id | example message | description
|
||||||
------------------------------ | --------------- | -------------------------
|
------------------------------ | --------------- | -------------------------
|
||||||
json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.
|
json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.
|
||||||
|
json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON.
|
||||||
|
|
||||||
@sa @ref exception for the base class of the library exceptions
|
@sa @ref exception for the base class of the library exceptions
|
||||||
@sa @ref parse_error for exceptions indicating a parse error
|
@sa @ref parse_error for exceptions indicating a parse error
|
||||||
|
|
|
@ -149,9 +149,19 @@ class binary_writer
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float: // Double-Precision Float
|
case value_t::number_float:
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>(0xFB));
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // Single-Precision Float
|
||||||
|
oa->write_character(static_cast<CharType>(0xFA));
|
||||||
|
break;
|
||||||
|
case 8: // Double-Precision Float
|
||||||
|
oa->write_character(static_cast<CharType>(0xFB));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
write_number(j.m_value.number_float);
|
write_number(j.m_value.number_float);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -409,9 +419,19 @@ class binary_writer
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float: // float 64
|
case value_t::number_float:
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>(0xCB));
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
oa->write_character(static_cast<CharType>(0xCA));
|
||||||
|
break;
|
||||||
|
case 8: // float 64
|
||||||
|
oa->write_character(static_cast<CharType>(0xCB));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
write_number(j.m_value.number_float);
|
write_number(j.m_value.number_float);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -712,7 +732,17 @@ class binary_writer
|
||||||
{
|
{
|
||||||
if (add_prefix)
|
if (add_prefix)
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>('D')); // float64
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
oa->write_character(static_cast<CharType>('d'));
|
||||||
|
break;
|
||||||
|
case 8: // float 64
|
||||||
|
oa->write_character(static_cast<CharType>('D'));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
write_number(n);
|
write_number(n);
|
||||||
}
|
}
|
||||||
|
@ -892,7 +922,15 @@ class binary_writer
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float:
|
case value_t::number_float:
|
||||||
return 'D';
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
return 'd';
|
||||||
|
case 8: // float 64
|
||||||
|
return 'D';
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
|
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
return 'S';
|
return 'S';
|
||||||
|
|
|
@ -794,6 +794,7 @@ Exceptions have ids 5xx.
|
||||||
name / id | example message | description
|
name / id | example message | description
|
||||||
------------------------------ | --------------- | -------------------------
|
------------------------------ | --------------- | -------------------------
|
||||||
json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.
|
json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.
|
||||||
|
json.exception.other_error.502 | type for number_float_t is not supported | The template type for a number is not supported for the binary serialization in CBOR, MessagePack or UBJSON.
|
||||||
|
|
||||||
@sa @ref exception for the base class of the library exceptions
|
@sa @ref exception for the base class of the library exceptions
|
||||||
@sa @ref parse_error for exceptions indicating a parse error
|
@sa @ref parse_error for exceptions indicating a parse error
|
||||||
|
@ -6357,9 +6358,19 @@ class binary_writer
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float: // Double-Precision Float
|
case value_t::number_float:
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>(0xFB));
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // Single-Precision Float
|
||||||
|
oa->write_character(static_cast<CharType>(0xFA));
|
||||||
|
break;
|
||||||
|
case 8: // Double-Precision Float
|
||||||
|
oa->write_character(static_cast<CharType>(0xFB));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
write_number(j.m_value.number_float);
|
write_number(j.m_value.number_float);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6617,9 +6628,19 @@ class binary_writer
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float: // float 64
|
case value_t::number_float:
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>(0xCB));
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
oa->write_character(static_cast<CharType>(0xCA));
|
||||||
|
break;
|
||||||
|
case 8: // float 64
|
||||||
|
oa->write_character(static_cast<CharType>(0xCB));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
write_number(j.m_value.number_float);
|
write_number(j.m_value.number_float);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6920,7 +6941,17 @@ class binary_writer
|
||||||
{
|
{
|
||||||
if (add_prefix)
|
if (add_prefix)
|
||||||
{
|
{
|
||||||
oa->write_character(static_cast<CharType>('D')); // float64
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
oa->write_character(static_cast<CharType>('d'));
|
||||||
|
break;
|
||||||
|
case 8: // float 64
|
||||||
|
oa->write_character(static_cast<CharType>('D'));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
write_number(n);
|
write_number(n);
|
||||||
}
|
}
|
||||||
|
@ -7100,7 +7131,15 @@ class binary_writer
|
||||||
}
|
}
|
||||||
|
|
||||||
case value_t::number_float:
|
case value_t::number_float:
|
||||||
return 'D';
|
switch (sizeof(typename BasicJsonType::number_float_t))
|
||||||
|
{
|
||||||
|
case 4: // float 32
|
||||||
|
return 'd';
|
||||||
|
case 8: // float 64
|
||||||
|
return 'D';
|
||||||
|
default:
|
||||||
|
JSON_THROW(other_error::create(502, "type for number_float_t is not supported"));
|
||||||
|
}
|
||||||
|
|
||||||
case value_t::string:
|
case value_t::string:
|
||||||
return 'S';
|
return 'S';
|
||||||
|
|
|
@ -114,6 +114,13 @@ struct nocopy
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
// for #1021
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
using float_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int32_t, std::uint32_t, float>;
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("regression tests")
|
TEST_CASE("regression tests")
|
||||||
{
|
{
|
||||||
SECTION("issue #60 - Double quotation mark is not parsed correctly")
|
SECTION("issue #60 - Double quotation mark is not parsed correctly")
|
||||||
|
@ -1597,4 +1604,15 @@ TEST_CASE("regression tests")
|
||||||
auto j = json::parse(geojsonExample, cb, true);
|
auto j = json::parse(geojsonExample, cb, true);
|
||||||
CHECK(j == json());
|
CHECK(j == json());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("issue #1021 - to/from_msgpack only works with standard typization")
|
||||||
|
{
|
||||||
|
float_json j = 1000.0;
|
||||||
|
CHECK(float_json::from_cbor(float_json::to_cbor(j)) == j);
|
||||||
|
CHECK(float_json::from_msgpack(float_json::to_msgpack(j)) == j);
|
||||||
|
CHECK(float_json::from_ubjson(float_json::to_ubjson(j)) == j);
|
||||||
|
|
||||||
|
float_json j2 = {1000.0, 2000.0, 3000.0};
|
||||||
|
CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue