JSON for Modern C++ 3.10.4

◆ 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, class BinaryType = std::vector<std::uint8_t>>
static basic_json nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType >::diff ( const basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType > &  source,
const basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType > &  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;
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:26258
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
5using json = nlohmann::json;
6
7int 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}
basic_json patch(const basic_json &json_patch) const
applies a JSON patch
Definition: json.hpp:25952
basic_json<> json
default JSON class
Definition: json.hpp:3472

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
see patch – apply a JSON patch
see merge_patch – apply a JSON Merge Patch
RFC 6902 (JSON Patch)
Since
version 2.0.0

Definition at line 26258 of file json.hpp.