Merge branch 'develop' of https://github.com/nlohmann/json into develop
This commit is contained in:
		
						commit
						e5a67fc3f8
					
				
					 3 changed files with 61 additions and 0 deletions
				
			
		|  | @ -5,6 +5,7 @@ | |||
| #include <ciso646> // and, not
 | ||||
| #include <forward_list> // forward_list
 | ||||
| #include <iterator> // inserter, front_inserter, end
 | ||||
| #include <map> // map
 | ||||
| #include <string> // string
 | ||||
| #include <tuple> // tuple, make_tuple
 | ||||
| #include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible
 | ||||
|  | @ -277,6 +278,25 @@ void from_json(const BasicJsonType& j, std::tuple<Args...>& t) | |||
|     from_json_tuple_impl(j, t, index_sequence_for<Args...> {}); | ||||
| } | ||||
| 
 | ||||
| template <typename BasicJsonType, typename Key, typename Value, | ||||
|           typename = enable_if_t<not std::is_constructible< | ||||
|                                      typename BasicJsonType::string_t, Key>::value>> | ||||
| void from_json(const BasicJsonType& j, std::map<Key, Value>& m) | ||||
| { | ||||
|     if (JSON_UNLIKELY(not j.is_array())) | ||||
|     { | ||||
|         JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); | ||||
|     } | ||||
|     for (const auto& p : j) | ||||
|     { | ||||
|         if (JSON_UNLIKELY(not p.is_array())) | ||||
|         { | ||||
|             JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); | ||||
|         } | ||||
|         m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| struct from_json_fn | ||||
| { | ||||
|   private: | ||||
|  |  | |||
|  | @ -909,6 +909,7 @@ inline bool operator<(const value_t lhs, const value_t rhs) noexcept | |||
| #include <ciso646> // and, not
 | ||||
| #include <forward_list> // forward_list
 | ||||
| #include <iterator> // inserter, front_inserter, end
 | ||||
| #include <map> // map
 | ||||
| #include <string> // string
 | ||||
| #include <tuple> // tuple, make_tuple
 | ||||
| #include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible
 | ||||
|  | @ -1185,6 +1186,25 @@ void from_json(const BasicJsonType& j, std::tuple<Args...>& t) | |||
|     from_json_tuple_impl(j, t, index_sequence_for<Args...> {}); | ||||
| } | ||||
| 
 | ||||
| template <typename BasicJsonType, typename Key, typename Value, | ||||
|           typename = enable_if_t<not std::is_constructible< | ||||
|                                      typename BasicJsonType::string_t, Key>::value>> | ||||
| void from_json(const BasicJsonType& j, std::map<Key, Value>& m) | ||||
| { | ||||
|     if (JSON_UNLIKELY(not j.is_array())) | ||||
|     { | ||||
|         JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); | ||||
|     } | ||||
|     for (const auto& p : j) | ||||
|     { | ||||
|         if (JSON_UNLIKELY(not p.is_array())) | ||||
|         { | ||||
|             JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); | ||||
|         } | ||||
|         m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| struct from_json_fn | ||||
| { | ||||
|   private: | ||||
|  |  | |||
|  | @ -1079,6 +1079,26 @@ TEST_CASE("value conversion") | |||
|                 j5.get<std::unordered_set<std::string>>(); | ||||
|             } | ||||
| 
 | ||||
|             SECTION("std::map (array of pairs)") | ||||
|             { | ||||
|                 std::map<int, int> m{{0, 1}, {1, 2}, {2, 3}}; | ||||
|                 json j6 = m; | ||||
| 
 | ||||
|                 auto m2 = j6.get<std::map<int, int>>(); | ||||
|                 CHECK(m == m2); | ||||
| 
 | ||||
|                 json j7 = {0, 1, 2, 3}; | ||||
|                 CHECK_THROWS_AS((j7.get<std::map<int, int>>()), json::type_error&); | ||||
|                 CHECK_THROWS_WITH((j7.get<std::map<int, int>>()), "[json.exception.type_error.302] type must be array, but is number"); | ||||
| 
 | ||||
|                 SECTION("superfluous entries") | ||||
|                 { | ||||
|                   json j8 = {{0, 1, 2}, {1, 2, 3}, {2, 3, 4}}; | ||||
|                   m2 = j8.get<std::map<int, int>>(); | ||||
|                   CHECK(m == m2); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             SECTION("exception in case of a non-object type") | ||||
|             { | ||||
|                 CHECK_THROWS_AS((json().get<std::list<int>>()), json::type_error&); | ||||
|  | @ -1094,6 +1114,7 @@ TEST_CASE("value conversion") | |||
|                 CHECK_THROWS_WITH((json().get<std::vector<json>>()), "[json.exception.type_error.302] type must be array, but is null"); | ||||
|                 CHECK_THROWS_WITH((json().get<std::list<json>>()), "[json.exception.type_error.302] type must be array, but is null"); | ||||
|                 CHECK_THROWS_WITH((json().get<std::valarray<int>>()), "[json.exception.type_error.302] type must be array, but is null"); | ||||
|                 CHECK_THROWS_WITH((json().get<std::map<int, int>>()), "[json.exception.type_error.302] type must be array, but is null"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue