Merge pull request #876 from nlohmann/feature/rfc7396
JSON Merge Patch (RFC 7396)
This commit is contained in:
		
						commit
						6402077ac2
					
				
					 7 changed files with 470 additions and 0 deletions
				
			
		|  | @ -7397,6 +7397,7 @@ class basic_json | ||||||
|     diff for two JSON values.,diff} |     diff for two JSON values.,diff} | ||||||
| 
 | 
 | ||||||
|     @sa @ref patch -- apply a JSON patch |     @sa @ref patch -- apply a JSON patch | ||||||
|  |     @sa @ref merge_patch -- apply a JSON Merge Patch | ||||||
| 
 | 
 | ||||||
|     @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
 |     @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
 | ||||||
| 
 | 
 | ||||||
|  | @ -7528,6 +7529,83 @@ class basic_json | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// @}
 |     /// @}
 | ||||||
|  | 
 | ||||||
|  |     ////////////////////////////////
 | ||||||
|  |     // JSON Merge Patch functions //
 | ||||||
|  |     ////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  |     /// @name JSON Merge Patch functions
 | ||||||
|  |     /// @{
 | ||||||
|  | 
 | ||||||
|  |     /*!
 | ||||||
|  |     @brief applies a JSON Merge Patch | ||||||
|  | 
 | ||||||
|  |     The merge patch format is primarily intended for use with the HTTP PATCH | ||||||
|  |     method as a means of describing a set of modifications to a target | ||||||
|  |     resource's content. This function applies a merge patch to the current | ||||||
|  |     JSON value. | ||||||
|  | 
 | ||||||
|  |     The function implements the following algorithm from Section 2 of | ||||||
|  |     [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396):
 | ||||||
|  | 
 | ||||||
|  |     ``` | ||||||
|  |     define MergePatch(Target, Patch): | ||||||
|  |       if Patch is an Object: | ||||||
|  |         if Target is not an Object: | ||||||
|  |           Target = {} // Ignore the contents and set it to an empty Object
 | ||||||
|  |         for each Name/Value pair in Patch: | ||||||
|  |           if Value is null: | ||||||
|  |             if Name exists in Target: | ||||||
|  |               remove the Name/Value pair from Target | ||||||
|  |           else: | ||||||
|  |             Target[Name] = MergePatch(Target[Name], Value) | ||||||
|  |         return Target | ||||||
|  |       else: | ||||||
|  |         return Patch | ||||||
|  |     ``` | ||||||
|  | 
 | ||||||
|  |     Thereby, `Target` is the current object; that is, the patch is applied to | ||||||
|  |     the current value. | ||||||
|  | 
 | ||||||
|  |     @param[in] patch  the patch to apply | ||||||
|  | 
 | ||||||
|  |     @complexity Linear in the lengths of @a patch. | ||||||
|  | 
 | ||||||
|  |     @liveexample{The following code shows how a JSON Merge Patch is applied to | ||||||
|  |     a JSON document.,merge_patch} | ||||||
|  | 
 | ||||||
|  |     @sa @ref patch -- apply a JSON patch | ||||||
|  |     @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)
 | ||||||
|  | 
 | ||||||
|  |     @since version 3.0.0 | ||||||
|  |     */ | ||||||
|  |     void merge_patch(const basic_json& patch) | ||||||
|  |     { | ||||||
|  |         if (patch.is_object()) | ||||||
|  |         { | ||||||
|  |             if (not is_object()) | ||||||
|  |             { | ||||||
|  |                 *this = object(); | ||||||
|  |             } | ||||||
|  |             for (auto it = patch.begin(); it != patch.end(); ++it) | ||||||
|  |             { | ||||||
|  |                 if (it.value().is_null()) | ||||||
|  |                 { | ||||||
|  |                     erase(it.key()); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     operator[](it.key()).merge_patch(it.value()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             *this = patch; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /// @}
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| //////////////////
 | //////////////////
 | ||||||
|  |  | ||||||
							
								
								
									
										40
									
								
								doc/examples/merge_patch.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								doc/examples/merge_patch.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | #include <iostream> | ||||||
|  | #include "json.hpp" | ||||||
|  | #include <iomanip> // for std::setw
 | ||||||
|  | 
 | ||||||
|  | using json = nlohmann::json; | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     // the original document
 | ||||||
|  |     json document = R"({ | ||||||
|  |                 "title": "Goodbye!", | ||||||
|  |                 "author": { | ||||||
|  |                     "givenName": "John", | ||||||
|  |                     "familyName": "Doe" | ||||||
|  |                 }, | ||||||
|  |                 "tags": [ | ||||||
|  |                     "example", | ||||||
|  |                     "sample" | ||||||
|  |                 ], | ||||||
|  |                 "content": "This will be unchanged" | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |     // the patch
 | ||||||
|  |     json patch = R"({ | ||||||
|  |                 "title": "Hello!", | ||||||
|  |                 "phoneNumber": "+01-123-456-7890", | ||||||
|  |                 "author": { | ||||||
|  |                     "familyName": null | ||||||
|  |                 }, | ||||||
|  |                 "tags": [ | ||||||
|  |                     "example" | ||||||
|  |                 ] | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |     // apply the patch
 | ||||||
|  |     document.merge_patch(patch); | ||||||
|  | 
 | ||||||
|  |     // output original and patched document
 | ||||||
|  |     std::cout << std::setw(4) << document << std::endl; | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								doc/examples/merge_patch.link
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								doc/examples/merge_patch.link
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | <a target="_blank" href="https://wandbox.org/permlink/h13IsbffwmMfqsej"><b>online</b></a> | ||||||
							
								
								
									
										11
									
								
								doc/examples/merge_patch.output
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								doc/examples/merge_patch.output
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | { | ||||||
|  |     "author": { | ||||||
|  |         "givenName": "John" | ||||||
|  |     }, | ||||||
|  |     "content": "This will be unchanged", | ||||||
|  |     "phoneNumber": "+01-123-456-7890", | ||||||
|  |     "tags": [ | ||||||
|  |         "example" | ||||||
|  |     ], | ||||||
|  |     "title": "Hello!" | ||||||
|  | } | ||||||
							
								
								
									
										78
									
								
								src/json.hpp
									
										
									
									
									
								
							
							
						
						
									
										78
									
								
								src/json.hpp
									
										
									
									
									
								
							|  | @ -14685,6 +14685,7 @@ class basic_json | ||||||
|     diff for two JSON values.,diff} |     diff for two JSON values.,diff} | ||||||
| 
 | 
 | ||||||
|     @sa @ref patch -- apply a JSON patch |     @sa @ref patch -- apply a JSON patch | ||||||
|  |     @sa @ref merge_patch -- apply a JSON Merge Patch | ||||||
| 
 | 
 | ||||||
|     @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
 |     @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902)
 | ||||||
| 
 | 
 | ||||||
|  | @ -14816,6 +14817,83 @@ class basic_json | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// @}
 |     /// @}
 | ||||||
|  | 
 | ||||||
|  |     ////////////////////////////////
 | ||||||
|  |     // JSON Merge Patch functions //
 | ||||||
|  |     ////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  |     /// @name JSON Merge Patch functions
 | ||||||
|  |     /// @{
 | ||||||
|  | 
 | ||||||
|  |     /*!
 | ||||||
|  |     @brief applies a JSON Merge Patch | ||||||
|  | 
 | ||||||
|  |     The merge patch format is primarily intended for use with the HTTP PATCH | ||||||
|  |     method as a means of describing a set of modifications to a target | ||||||
|  |     resource's content. This function applies a merge patch to the current | ||||||
|  |     JSON value. | ||||||
|  | 
 | ||||||
|  |     The function implements the following algorithm from Section 2 of | ||||||
|  |     [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396):
 | ||||||
|  | 
 | ||||||
|  |     ``` | ||||||
|  |     define MergePatch(Target, Patch): | ||||||
|  |       if Patch is an Object: | ||||||
|  |         if Target is not an Object: | ||||||
|  |           Target = {} // Ignore the contents and set it to an empty Object
 | ||||||
|  |         for each Name/Value pair in Patch: | ||||||
|  |           if Value is null: | ||||||
|  |             if Name exists in Target: | ||||||
|  |               remove the Name/Value pair from Target | ||||||
|  |           else: | ||||||
|  |             Target[Name] = MergePatch(Target[Name], Value) | ||||||
|  |         return Target | ||||||
|  |       else: | ||||||
|  |         return Patch | ||||||
|  |     ``` | ||||||
|  | 
 | ||||||
|  |     Thereby, `Target` is the current object; that is, the patch is applied to | ||||||
|  |     the current value. | ||||||
|  | 
 | ||||||
|  |     @param[in] patch  the patch to apply | ||||||
|  | 
 | ||||||
|  |     @complexity Linear in the lengths of @a patch. | ||||||
|  | 
 | ||||||
|  |     @liveexample{The following code shows how a JSON Merge Patch is applied to | ||||||
|  |     a JSON document.,merge_patch} | ||||||
|  | 
 | ||||||
|  |     @sa @ref patch -- apply a JSON patch | ||||||
|  |     @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396)
 | ||||||
|  | 
 | ||||||
|  |     @since version 3.0.0 | ||||||
|  |     */ | ||||||
|  |     void merge_patch(const basic_json& patch) | ||||||
|  |     { | ||||||
|  |         if (patch.is_object()) | ||||||
|  |         { | ||||||
|  |             if (not is_object()) | ||||||
|  |             { | ||||||
|  |                 *this = object(); | ||||||
|  |             } | ||||||
|  |             for (auto it = patch.begin(); it != patch.end(); ++it) | ||||||
|  |             { | ||||||
|  |                 if (it.value().is_null()) | ||||||
|  |                 { | ||||||
|  |                     erase(it.key()); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     operator[](it.key()).merge_patch(it.value()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             *this = patch; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /// @}
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| //////////////////
 | //////////////////
 | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ SOURCES = src/unit.cpp \ | ||||||
|           src/unit-iterator_wrapper.cpp \
 |           src/unit-iterator_wrapper.cpp \
 | ||||||
|           src/unit-iterators1.cpp \
 |           src/unit-iterators1.cpp \
 | ||||||
|           src/unit-iterators2.cpp \
 |           src/unit-iterators2.cpp \
 | ||||||
|  |           src/unit-merge_patch.cpp \
 | ||||||
|           src/unit-json_patch.cpp \
 |           src/unit-json_patch.cpp \
 | ||||||
|           src/unit-json_pointer.cpp \
 |           src/unit-json_pointer.cpp \
 | ||||||
|           src/unit-meta.cpp \
 |           src/unit-meta.cpp \
 | ||||||
|  |  | ||||||
							
								
								
									
										261
									
								
								test/src/unit-merge_patch.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										261
									
								
								test/src/unit-merge_patch.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,261 @@ | ||||||
|  | /*
 | ||||||
|  |     __ _____ _____ _____ | ||||||
|  |  __|  |   __|     |   | |  JSON for Modern C++ (test suite) | ||||||
|  | |  |  |__   |  |  | | | |  version 2.1.1 | ||||||
|  | |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 | ||||||
|  | 
 | ||||||
|  | Licensed under the MIT License <http://opensource.org/licenses/MIT>.
 | ||||||
|  | Copyright (c) 2013-2017 Niels Lohmann <http://nlohmann.me>.
 | ||||||
|  | 
 | ||||||
|  | Permission is hereby  granted, free of charge, to any  person obtaining a copy | ||||||
|  | of this software and associated  documentation files (the "Software"), to deal | ||||||
|  | in the Software  without restriction, including without  limitation the rights | ||||||
|  | to  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell | ||||||
|  | copies  of  the Software,  and  to  permit persons  to  whom  the Software  is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE  IS PROVIDED "AS  IS", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR | ||||||
|  | IMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY, | ||||||
|  | FITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE | ||||||
|  | AUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "catch.hpp" | ||||||
|  | 
 | ||||||
|  | #include "json.hpp" | ||||||
|  | using nlohmann::json; | ||||||
|  | 
 | ||||||
|  | TEST_CASE("JSON Merge Patch") | ||||||
|  | { | ||||||
|  |     SECTION("examples from RFC 7396") | ||||||
|  |     { | ||||||
|  |         SECTION("Section 1") | ||||||
|  |         { | ||||||
|  |             json document = R"({ | ||||||
|  |                 "a": "b", | ||||||
|  |                 "c": { | ||||||
|  |                     "d": "e", | ||||||
|  |                     "f": "g" | ||||||
|  |                 } | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             json patch = R"({ | ||||||
|  |                 "a": "z", | ||||||
|  |                 "c": { | ||||||
|  |                     "f": null | ||||||
|  |                 } | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             json expected = R"({ | ||||||
|  |                 "a": "z", | ||||||
|  |                 "c": { | ||||||
|  |                     "d": "e" | ||||||
|  |                 } | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             document.merge_patch(patch); | ||||||
|  |             CHECK(document == expected); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         SECTION("Section 3") | ||||||
|  |         { | ||||||
|  |             json document = R"({ | ||||||
|  |                 "title": "Goodbye!", | ||||||
|  |                 "author": { | ||||||
|  |                     "givenName": "John", | ||||||
|  |                     "familyName": "Doe" | ||||||
|  |                 }, | ||||||
|  |                 "tags": [ | ||||||
|  |                     "example", | ||||||
|  |                     "sample" | ||||||
|  |                 ], | ||||||
|  |                 "content": "This will be unchanged" | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             json patch = R"({ | ||||||
|  |                 "title": "Hello!", | ||||||
|  |                 "phoneNumber": "+01-123-456-7890", | ||||||
|  |                 "author": { | ||||||
|  |                     "familyName": null | ||||||
|  |                 }, | ||||||
|  |                 "tags": [ | ||||||
|  |                     "example" | ||||||
|  |                 ] | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             json expected = R"({ | ||||||
|  |                 "title": "Hello!", | ||||||
|  |                 "author": { | ||||||
|  |                     "givenName": "John" | ||||||
|  |                 }, | ||||||
|  |                 "tags": [ | ||||||
|  |                     "example" | ||||||
|  |                 ], | ||||||
|  |                 "content": "This will be unchanged", | ||||||
|  |                 "phoneNumber": "+01-123-456-7890" | ||||||
|  |             })"_json; | ||||||
|  | 
 | ||||||
|  |             document.merge_patch(patch); | ||||||
|  |             CHECK(document == expected); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         SECTION("Appendix A") | ||||||
|  |         { | ||||||
|  |             SECTION("Example 1") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"b"})"_json; | ||||||
|  |                 json patch = R"({"a":"c"})"_json; | ||||||
|  |                 json result = R"({"a":"c"})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 2") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"b"})"_json; | ||||||
|  |                 json patch = R"({"b":"c"})"_json; | ||||||
|  |                 json result = R"({"a":"b", "b":"c"})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 3") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"b"})"_json; | ||||||
|  |                 json patch = R"({"a":null})"_json; | ||||||
|  |                 json result = R"({})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 4") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"b","b":"c"})"_json; | ||||||
|  |                 json patch = R"({"a":null})"_json; | ||||||
|  |                 json result = R"({"b":"c"})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 5") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":["b"]})"_json; | ||||||
|  |                 json patch = R"({"a":"c"})"_json; | ||||||
|  |                 json result = R"({"a":"c"})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 6") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"c"})"_json; | ||||||
|  |                 json patch = R"({"a":["b"]})"_json; | ||||||
|  |                 json result = R"({"a":["b"]})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 7") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":{"b": "c"}})"_json; | ||||||
|  |                 json patch = R"({"a":{"b":"d","c":null}})"_json; | ||||||
|  |                 json result = R"({"a": {"b": "d"}})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 8") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":[{"b":"c"}]})"_json; | ||||||
|  |                 json patch = R"({"a":[1]})"_json; | ||||||
|  |                 json result = R"({"a":[1]})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 9") | ||||||
|  |             { | ||||||
|  |                 json original = R"(["a","b"])"_json; | ||||||
|  |                 json patch = R"(["c","d"])"_json; | ||||||
|  |                 json result = R"(["c","d"])"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 10") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"b"})"_json; | ||||||
|  |                 json patch = R"(["c"])"_json; | ||||||
|  |                 json result = R"(["c"])"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 11") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"foo"})"_json; | ||||||
|  |                 json patch = R"(null)"_json; | ||||||
|  |                 json result = R"(null)"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 12") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"a":"foo"})"_json; | ||||||
|  |                 json patch = R"("bar")"_json; | ||||||
|  |                 json result = R"("bar")"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 13") | ||||||
|  |             { | ||||||
|  |                 json original = R"({"e":null})"_json; | ||||||
|  |                 json patch = R"({"a":1})"_json; | ||||||
|  |                 json result = R"({"e":null,"a":1})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 14") | ||||||
|  |             { | ||||||
|  |                 json original = R"([1,2])"_json; | ||||||
|  |                 json patch = R"({"a":"b","c":null})"_json; | ||||||
|  |                 json result = R"({"a":"b"})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SECTION("Example 15") | ||||||
|  |             { | ||||||
|  |                 json original = R"({})"_json; | ||||||
|  |                 json patch = R"({"a":{"bb":{"ccc":null}}})"_json; | ||||||
|  |                 json result = R"({"a":{"bb":{}}})"_json; | ||||||
|  | 
 | ||||||
|  |                 original.merge_patch(patch); | ||||||
|  |                 CHECK(original == result); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue