mirror of
https://github.com/nlohmann/json.git
synced 2026-10-05 22:20:30 +00:00
* Store maps with enum keys as objects (opt-in) Maps with enum keys, such as std::map<E, T>, are stored as arrays of [key, value] pairs, because enums are not convertible to the string type of object keys - even if NLOHMANN_JSON_SERIALIZE_ENUM maps them to strings (#4378). The new JSON_USE_OBJECTS_FOR_ENUM_KEYED_MAPS macro stores them as objects instead, converting each key with the enum's to_json. It applies to any map-like type with enum keys (std::map with any comparator, std::unordered_map, ...). A key that does not convert to a string throws type_error.302, and two keys converting to the same string throw the new type_error.318, rather than losing an entry. The macro changes the output of inline functions, so it is part of the ABI tag (_ekmo). Reading needs no macro: std::map and std::unordered_map with enum keys are now also read from objects, converting each key with the enum's from_json. That input was rejected before, and arrays of pairs are still read, so data written either way can be read. This supersedes #4531, which first proposed storing these maps as objects. Co-authored-by: Muhammad Amir bin Mohamad Ghazaly <amirghaz@umich.edu> Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Keep multimaps with enum keys as arrays of pairs With JSON_USE_OBJECTS_FOR_ENUM_KEYED_MAPS, is_enum_keyed_map also matched std::multimap and std::unordered_multimap. Storing them as objects throws type_error.318 as soon as a key occurs twice, which is the normal case for a multimap, so such values could no longer be serialized at all once the macro was enabled, although they are stored losslessly as arrays of [key, value] pairs without it. Exclude maps with non-unique keys from is_enum_keyed_map. They are detected by insert(value_type) returning an iterator rather than a pair<iterator, bool>. Map-like types without such an insert() are still treated as before. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Move the default enum-keyed map tests out of unit-conversions.cpp The Windows clang 20.1.8 job (MinGW, Debug) failed to link test-conversions_cpp17 with "relocation truncated to fit: IMAGE_REL_AMD64_REL32 against .rdata": the object file of unit-conversions.cpp was already close to the limit, and the new "maps with enum keys" test case pushed it over. windows.yml asks to keep these objects small by splitting test files. Move the test case unchanged into unit-enum_keyed_maps_default.cpp, with the three enums it needs. It still honors a -D flag for JSON_USE_OBJECTS_FOR_ENUM_KEYED_MAPS, as before. unit-conversions.cpp is back to its state on develop. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Build the enum-keyed map test object instead of parsing it ci_test_diagnostic_positions failed in unit-enum_keyed_maps_default.cpp: with JSON_DIAGNOSTIC_POSITIONS, a parsed value adds its byte range to the exception message ("(bytes 0-7) type must be array, but is object"), so the exact-message checks did not match. Build the object in memory, like unit-custom-array-type.cpp does. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me> Co-authored-by: Muhammad Amir bin Mohamad Ghazaly <amirghaz@umich.edu>
50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
// clean up
|
|
#undef JSON_ASSERT
|
|
#undef JSON_INTERNAL_CATCH
|
|
#undef JSON_THROW
|
|
#undef JSON_PRIVATE_UNLESS_TESTED
|
|
#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
|
|
#undef NLOHMANN_BASIC_JSON_TPL
|
|
#undef JSON_EXPLICIT
|
|
#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL
|
|
#undef JSON_INLINE_VARIABLE
|
|
#undef JSON_NO_UNIQUE_ADDRESS
|
|
#undef JSON_DISABLE_ENUM_SERIALIZATION
|
|
#undef JSON_DISABLE_TUPLE_REFERENCE_CONVERSION
|
|
|
|
#ifndef JSON_TEST_KEEP_MACROS
|
|
#undef JSON_CATCH
|
|
#undef JSON_TRY
|
|
#undef JSON_HAS_CPP_11
|
|
#undef JSON_HAS_CPP_14
|
|
#undef JSON_HAS_CPP_17
|
|
#undef JSON_HAS_CPP_20
|
|
#undef JSON_HAS_CPP_23
|
|
#undef JSON_HAS_CPP_26
|
|
#undef JSON_HAS_FILESYSTEM
|
|
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
|
#undef JSON_HAS_THREE_WAY_COMPARISON
|
|
#undef JSON_HAS_RANGES
|
|
#undef JSON_HAS_RANGE_VIEW_CONVERSION
|
|
#undef JSON_HAS_STD_FORMAT
|
|
#undef JSON_HAS_STATIC_RTTI
|
|
#undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
|
#undef JSON_BRACE_INIT_COPY_SEMANTICS
|
|
#undef JSON_PRECISE_STREAM_POSITION
|
|
#undef JSON_STRICT_NUL_HANDLING
|
|
#undef JSON_STRICT_BINARY_UTF8
|
|
#undef JSON_USE_OBJECTS_FOR_ENUM_KEYED_MAPS
|
|
#endif
|
|
|
|
#include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
|