diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 619048a35..7f11cc4e0 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -2111,20 +2111,46 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } + template + using Alias = T; + /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template - reference operator[](T * (&key)[n]) + reference operator[](Alias const& key) { - return operator[](static_cast(key)); + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto result = m_value.object->emplace(key, nullptr); + return set_parent(result.first->second); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template - const_reference operator[](T * (&key)[n]) const + const_reference operator[](Alias const& key) const { - return operator[](static_cast(key)); + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto it = m_value.object->find(key); + JSON_ASSERT(it != m_value.object->end()); + return it->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } /// @brief access specified object element with default value diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 47494a492..983060395 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -19300,20 +19300,46 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } + template + using Alias = T; + /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template - reference operator[](T * (&key)[n]) + reference operator[](Alias const& key) { - return operator[](static_cast(key)); + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto result = m_value.object->emplace(key, nullptr); + return set_parent(result.first->second); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template - const_reference operator[](T * (&key)[n]) const + const_reference operator[](Alias const& key) const { - return operator[](static_cast(key)); + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto it = m_value.object->find(key); + JSON_ASSERT(it != m_value.object->end()); + return it->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); } /// @brief access specified object element with default value