* docs: new design for the documentation site Apply the brand to the Material for MkDocs site: Inter and JetBrains Mono served by the site (upright and real italic), brand colours, blue header band with the syntax pattern, wordmark in the header, new home page (hero, cards, animated feature tour), 404 page, polish for tabs, search, footer, focus rings, tables and code blocks, and theme features (code copy, previous/next footer, TOC follow, search suggestions). Draw the number railroad diagram, the parser callback events and the iterator illustrations as inline SVGs that follow the light and dark scheme. The generator scripts are in docs/mkdocs/scripts/figures; the feature slideshow (json-light.svg, json-dark.svg, replacing json.gif on the home page) is built by docs/mkdocs/scripts/slideshow. Decision nodes in five flowcharts become hexagons, which need far less room. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: add figures, table captions and a macro chooser - Figures with numbered captions: SAX stepper, json_view layout and edit stepper, exception map, JSON pointer and patch walkers, QA pipeline, scaling and binary size charts, roadmap lanes, release timeline, integration decision tree and namespace builder - Table captions (nj-table-caption) on 9 pages - Compile times: modules and PCH charts, filesystem section, re-measured Figure 1, links between features/modules.md and compile_times.md - Interactive macro chooser for features/arbitrary_types.md - Link check: exclude URLs that answer the plugin with 400/401/419 or are dead (customers.md) Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: macro chooser generates adl_serializer for non-default-constructible types Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: cross-link concept pages and API pages in See also sections Add See also links in both directions between the concept pages (features, home, integration) and the API pages, write API links in code font, give every entry a comment after a dash, and show the callback event figure on the parser callbacks page. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: address review comments on the new design - Home: add a "Latest release" button - Sponsors: update the list and group it by tier - Features: list all feature pages on the index page - Releases: add highlights per release, link the 4.0 roadmap, add the first commit to the timeline - Exceptions: prefix all example messages with the exception name - API: no code font for format names in the See also links of the to_/from_ pages - Merge Patch: show the document before, the patch, and the result - Replace "--" with typographic dashes, mark external links with an icon, center Mermaid diagrams Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
3.0 KiB
nlohmann::basic_json::merge_diff
static basic_json merge_diff(const basic_json& source,
const basic_json& target);
Creates a JSON Merge Patch so that value source can be changed into the value
target by calling the merge_patch function. The patch contains only what differs: changed and
added members with their new values, and removed members with the value #!json null. Nested objects are compared
member by member; any other value that differs, including an array, is replaced as a whole.
For two JSON values source and target, where target contains no object member whose value is #!json null, the
following code always yields #!cpp true (for ordered_json, see the notes below):
basic_json patched = source;
patched.merge_patch(merge_diff(source, target));
patched == target;
Parameters
source(in)- JSON value to compare from
target(in)- JSON value to compare against
Return value
a JSON Merge Patch to convert the source to target
Exception safety
Strong guarantee: source and target are never modified.
Complexity
Linear in the total number of values (including nested ones) in source and target, times the cost of a key-based
object operation (looking up a key, or adding one to the patch): logarithmic for json, and linear for
ordered_json (see ordered_map complexity). For
ordered_json, diffing two objects with n and m members therefore takes O((n+m)²).
Notes
- A merge patch uses
#!json nullto remove a member, so it cannot set a member to#!json null. As in RFC 7396, a#!json nullmember oftargetis treated as absent: the patch removes the member fromsourceinstead of setting it to#!json null. A member that is#!json nullin bothsourceandtargetis unchanged and left out of the patch, sosourcekeeps it. - A merge patch cannot reorder object members, and
merge_patchappends added members at the end. Forordered_json, the patched value therefore has the same members astarget, but not necessarily in the same order, and may compare unequal to it. The patch lists changed and removed members in the order ofsource, followed by added members in the order oftarget.
Examples
??? example
The following code shows how a JSON Merge Patch is created as a diff for two JSON values.
```cpp
--8<-- "examples/merge_diff.cpp"
```
Output:
```json
--8<-- "examples/merge_diff.output"
```
See also
- RFC 7396 (JSON Merge Patch) - specification of JSON Merge Patch
merge_patch- applies a JSON Merge Patchdiff- creates a diff as a JSON Patch- JSON Merge Patch - the article on JSON Merge Patch
Version history
- Added in version 3.13.0.