JSON for Modern C++  3.7.2

◆ diff()

template<template< typename U, typename V, typename... Args > class ObjectType = std::map, template< typename U, typename... Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator, template< typename T, typename SFINAE=void > class JSONSerializer = adl_serializer>
static basic_json nlohmann::basic_json::diff ( const basic_json source,
const basic_json target,
const std::string &  path = "" 
)
inlinestatic

Creates a JSON Patch so that value source can be changed into the value target by calling patch function.

Invariant
For two JSON values source and target, the following code yields always true:
source.patch(diff(source, target)) == target;
Note
Currently, only remove, add, and replace operations are generated.
Parameters
[in]sourceJSON value to compare from
[in]targetJSON value to compare against
[in]pathhelper value to create JSON pointers
Returns
a JSON patch to convert the source to target
Complexity
Linear in the lengths of source and target.
Example
The following code shows how a JSON patch is created as a diff for two JSON values.
1 #include <iostream>
2 #include <iomanip>
3 #include <nlohmann/json.hpp>
4 
5 using json = nlohmann::json;
6 
7 int main()
8 {
9  // the source document
10  json source = R"(
11  {
12  "baz": "qux",
13  "foo": "bar"
14  }
15  )"_json;
16 
17  // the target document
18  json target = R"(
19  {
20  "baz": "boo",
21  "hello": [
22  "world"
23  ]
24  }
25  )"_json;
26 
27  // create the patch
28  json patch = json::diff(source, target);
29 
30  // roundtrip
31  json patched_source = source.patch(patch);
32 
33  // output patch and roundtrip result
34  std::cout << std::setw(4) << patch << "\n\n"
35  << std::setw(4) << patched_source << std::endl;
36 }

Output (play with this example online):
[
    {
        "op": "replace",
        "path": "/baz",
        "value": "boo"
    },
    {
        "op": "remove",
        "path": "/foo"
    },
    {
        "op": "add",
        "path": "/hello",
        "value": [
            "world"
        ]
    }
]

{
    "baz": "boo",
    "hello": [
        "world"
    ]
}
The example code above can be translated with
g++ -std=c++11 -Isingle_include doc/examples/diff.cpp -o diff 
See also
patch – apply a JSON patch
merge_patch – apply a JSON Merge Patch
RFC 6902 (JSON Patch)
Since
version 2.0.0

Definition at line 22418 of file json.hpp.

nlohmann::basic_json::diff
static basic_json diff(const basic_json &source, const basic_json &target, const std::string &path="")
creates a diff as a JSON patch
Definition: json.hpp:22418
nlohmann::basic_json::patch
basic_json patch(const basic_json &json_patch) const
applies a JSON patch
Definition: json.hpp:22122
nlohmann::json
basic_json<> json
default JSON class
Definition: json.hpp:2445