mirror of
https://github.com/nlohmann/json.git
synced 2026-09-26 18:00:30 +00:00
Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55ff4c9eff | ||
|
|
633eef8494 | ||
|
|
e5f84e1ebf | ||
|
|
7fc3a7d87e | ||
|
|
43b689b9b6 | ||
|
|
a13902a33f | ||
|
|
c021a09b08 | ||
|
|
e4aaf46d38 | ||
|
|
5bc24e876b | ||
|
|
da7b9bdb3d | ||
|
|
634f49bc5b |
+1
-12
@@ -108,9 +108,7 @@ The tests are located in [`tests/src/unit-*.cpp`](https://github.com/nlohmann/js
|
|||||||
are structured along the features of the library or the nature of the tests. Usually, it should be clear from the
|
are structured along the features of the library or the nature of the tests. Usually, it should be clear from the
|
||||||
context which existing file needs to be extended, and only very few cases require creating new test files.
|
context which existing file needs to be extended, and only very few cases require creating new test files.
|
||||||
|
|
||||||
When fixing a bug, edit `unit-regression3.cpp` and add a section referencing the fixed issue.
|
When fixing a bug, edit `unit-regression2.cpp` and add a section referencing the fixed issue.
|
||||||
`unit-regression2.cpp` holds the older tests; the two files exist because a single one grew large enough for the
|
|
||||||
MinGW linker to fail relocating it, so please keep adding to the smaller file rather than growing the larger one.
|
|
||||||
|
|
||||||
#### Exceptions
|
#### Exceptions
|
||||||
|
|
||||||
@@ -158,15 +156,6 @@ make amalgamate
|
|||||||
Running `make amalgamate` will also apply automatic formatting to the source files using
|
Running `make amalgamate` will also apply automatic formatting to the source files using
|
||||||
[`Artistic Style`](https://astyle.sourceforge.net/). This formatting may modify your source files in-place. Be certain to review and commit any changes to avoid unintended formatting diffs in commits.
|
[`Artistic Style`](https://astyle.sourceforge.net/). This formatting may modify your source files in-place. Be certain to review and commit any changes to avoid unintended formatting diffs in commits.
|
||||||
|
|
||||||
If you add, rename, or remove a header in `include/nlohmann`, also regenerate the header list in
|
|
||||||
[`BUILD.bazel`](https://github.com/nlohmann/json/blob/develop/BUILD.bazel) (requires CMake) by executing:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
make BUILD.bazel
|
|
||||||
```
|
|
||||||
|
|
||||||
The amalgamation check in CI fails if any of these generated files is out of date.
|
|
||||||
|
|
||||||
## Recommended documentation
|
## Recommended documentation
|
||||||
|
|
||||||
- The library’s [README file](https://github.com/nlohmann/json/blob/master/README.md) is an excellent starting point to
|
- The library’s [README file](https://github.com/nlohmann/json/blob/master/README.md) is an excellent starting point to
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
- [ ] The changes are described in detail, both the what and why.
|
- [ ] The changes are described in detail, both the what and why.
|
||||||
- [ ] If applicable, an [existing issue](https://github.com/nlohmann/json/issues) is referenced.
|
- [ ] If applicable, an [existing issue](https://github.com/nlohmann/json/issues) is referenced.
|
||||||
- [ ] If applicable, a fixed [OSS-Fuzz](https://issues.oss-fuzz.com) issue is referenced as `OSS-Fuzz: <id>` (see [fuzz testing](https://github.com/nlohmann/json/blob/develop/tests/fuzzing.md#handling-oss-fuzz-reports)).
|
|
||||||
- [ ] The [Code coverage](https://coveralls.io/github/nlohmann/json) remained at 100%. A test case for every new line of code.
|
- [ ] The [Code coverage](https://coveralls.io/github/nlohmann/json) remained at 100%. A test case for every new line of code.
|
||||||
- [ ] If applicable, the [documentation](https://json.nlohmann.me) is updated.
|
- [ ] If applicable, the [documentation](https://json.nlohmann.me) is updated.
|
||||||
- [ ] The source code is amalgamated by running `make amalgamate`.
|
- [ ] The source code is amalgamated by running `make amalgamate`.
|
||||||
|
|||||||
+3
-14
@@ -9,23 +9,12 @@ identified a security vulnerability in this repository, please use the GitHub Se
|
|||||||
Until it is published, this draft security advisory will only be visible to the maintainers of this project. Other
|
Until it is published, this draft security advisory will only be visible to the maintainers of this project. Other
|
||||||
users and teams may be added once the advisory is created.
|
users and teams may be added once the advisory is created.
|
||||||
|
|
||||||
We will send a first response within 14 days, indicating the next steps in handling your report. After the initial
|
We will send a response indicating the next steps in handling your report. After the initial reply to your report, we
|
||||||
reply to your report, we will keep you informed of the progress towards a fix and full announcement and may ask for
|
will keep you informed of the progress towards a fix and full announcement and may ask for additional information or
|
||||||
additional information or guidance.
|
guidance.
|
||||||
|
|
||||||
For vulnerabilities in third-party dependencies or modules, please report them directly to the respective maintainers.
|
For vulnerabilities in third-party dependencies or modules, please report them directly to the respective maintainers.
|
||||||
|
|
||||||
## Disclosure and credit
|
|
||||||
|
|
||||||
Once a fix is released, we publish the security advisory and list the fixed vulnerability in the release notes. We
|
|
||||||
credit the reporter in both, unless they ask not to be named.
|
|
||||||
|
|
||||||
## Supported versions
|
|
||||||
|
|
||||||
Security fixes are made on the `develop` branch and shipped with the next release. Only the latest release receives
|
|
||||||
security fixes; they are not backported to older releases. A release stops receiving security fixes when the next
|
|
||||||
release is published, so please update to the latest release to get them.
|
|
||||||
|
|
||||||
## Unofficial packages
|
## Unofficial packages
|
||||||
|
|
||||||
This project does not publish an official npm package. The npm package
|
This project does not publish an official npm package. The npm package
|
||||||
|
|||||||
@@ -29,27 +29,6 @@ labels:
|
|||||||
files:
|
files:
|
||||||
- ".github/external_ci/.*"
|
- ".github/external_ci/.*"
|
||||||
|
|
||||||
- label: "CI"
|
|
||||||
files:
|
|
||||||
- ".github/(dependabot|labeler)\\.yml"
|
|
||||||
|
|
||||||
- label: "aspect: binary formats"
|
|
||||||
files:
|
|
||||||
- "include/nlohmann/detail/input/binary_reader\\.hpp"
|
|
||||||
- "include/nlohmann/detail/output/binary_writer\\.hpp"
|
|
||||||
- "tests/src/unit-(bson|cbor|msgpack|ubjson|bjdata|binary_formats)"
|
|
||||||
- "tests/src/fuzzer-parse_(bson|cbor|msgpack|ubjson|bjdata)"
|
|
||||||
- "docs/mkdocs/docs/features/binary_formats/"
|
|
||||||
- "docs/mkdocs/docs/(api/basic_json|examples)/(to|from)_(bson|cbor|msgpack|ubjson|bjdata)"
|
|
||||||
|
|
||||||
- label: "aspect: binary formats"
|
|
||||||
title: "(?i)(bson|cbor|msgpack|messagepack|ubjson|bjdata|binary format)"
|
|
||||||
|
|
||||||
- label: "python"
|
|
||||||
files:
|
|
||||||
- "\\.py$"
|
|
||||||
- "requirements[^/]*\\.txt$"
|
|
||||||
|
|
||||||
- label: "S"
|
- label: "S"
|
||||||
size-below: 10
|
size-below: 10
|
||||||
- label: "M"
|
- label: "M"
|
||||||
|
|||||||
@@ -3,10 +3,6 @@ name: "Check amalgamation"
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -15,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -38,7 +34,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -61,31 +57,18 @@ jobs:
|
|||||||
python3 -mvenv venv
|
python3 -mvenv venv
|
||||||
venv/bin/pip3 install -r $MAIN_DIR/tools/astyle/requirements.txt
|
venv/bin/pip3 install -r $MAIN_DIR/tools/astyle/requirements.txt
|
||||||
|
|
||||||
- name: Regenerate amalgamation, formatting, and BUILD.bazel
|
- name: Regenerate amalgamation and formatting
|
||||||
run: |
|
run: |
|
||||||
cd $MAIN_DIR
|
cd $MAIN_DIR
|
||||||
|
|
||||||
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json.json -s .
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json.json -s .
|
||||||
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json_fwd.json -s .
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json_fwd.json -s .
|
||||||
|
|
||||||
# the header list of the Bazel "json" target must match the files in include/
|
|
||||||
cmake -P cmake/scripts/gen_bazel_build_file.cmake
|
|
||||||
|
|
||||||
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
||||||
$INCLUDE_DIR/json.hpp $INCLUDE_DIR/json_fwd.hpp
|
$INCLUDE_DIR/json.hpp $INCLUDE_DIR/json_fwd.hpp
|
||||||
|
|
||||||
# fail loudly if a directory is renamed or removed: find would only warn
|
|
||||||
# about the missing path and silently drop its files from the check
|
|
||||||
SOURCE_DIRS="docs/mkdocs/docs/examples include tests"
|
|
||||||
for DIR in $SOURCE_DIRS; do
|
|
||||||
if [ ! -d "$DIR" ]; then
|
|
||||||
echo "::error::source directory '$DIR' does not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
||||||
$(find $SOURCE_DIRS -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' -not -path 'tests/abi/include/nlohmann/*' | sort)
|
$(find docs/examples include tests -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' -not -path 'tests/abi/include/nlohmann/*' | sort)
|
||||||
|
|
||||||
- name: Build patch and check for differences
|
- name: Build patch and check for differences
|
||||||
id: diff
|
id: diff
|
||||||
@@ -94,7 +77,7 @@ jobs:
|
|||||||
mkdir -p ${{ github.workspace }}/patch
|
mkdir -p ${{ github.workspace }}/patch
|
||||||
git diff --patch --no-color > ${{ github.workspace }}/patch/amalgamation.patch
|
git diff --patch --no-color > ${{ github.workspace }}/patch/amalgamation.patch
|
||||||
if [ -s ${{ github.workspace }}/patch/amalgamation.patch ]; then
|
if [ -s ${{ github.workspace }}/patch/amalgamation.patch ]; then
|
||||||
echo "The source code has not been amalgamated/formatted correctly or BUILD.bazel is out of date. Diff:"
|
echo "The source code has not been amalgamated/formatted correctly. Diff:"
|
||||||
cat ${{ github.workspace }}/patch/amalgamation.patch
|
cat ${{ github.workspace }}/patch/amalgamation.patch
|
||||||
echo "has_diff=true" >> "$GITHUB_OUTPUT"
|
echo "has_diff=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
name: CIFuzz
|
name: CIFuzz
|
||||||
on: [pull_request]
|
on: [pull_request]
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -13,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -38,14 +38,14 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
with:
|
with:
|
||||||
languages: c-cpp
|
languages: c-cpp
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/autobuild@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -95,13 +95,13 @@ jobs:
|
|||||||
issue_number: issue_number,
|
issue_number: issue_number,
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
body: '## 🔴 Amalgamation check failed! 🔴\nThe source code has not been amalgamated and/or formatted correctly, or `BUILD.bazel` is out of date.'
|
body: '## 🔴 Amalgamation check failed! 🔴\nThe source code has not been amalgamated and/or formatted correctly.'
|
||||||
+ (hasPatch ? '\n\n📎 A ready-to-apply patch is attached to the [failed workflow run](' + runUrl + ') as the `amalgamation-patch` artifact.'
|
+ (hasPatch ? '\n\n📎 A ready-to-apply patch is attached to the [failed workflow run](' + runUrl + ') as the `amalgamation-patch` artifact.'
|
||||||
+ ' Download it, then apply it locally from the repository root with:'
|
+ ' Download it, then apply it locally from the repository root with:'
|
||||||
+ '\n\n```shell\ngit apply amalgamation.patch\n```\n\n'
|
+ '\n\n```shell\ngit apply amalgamation.patch\n```\n\n'
|
||||||
+ 'This does not require installing astyle yourself.'
|
+ 'This does not require installing astyle yourself.'
|
||||||
: '')
|
: '')
|
||||||
+ (first ? '\n\n@' + author + ' Please read and follow the [Contribution Guidelines]'
|
+ (first ? '\n\n@' + author + ' Please read and follow the [Contribution Guidelines]'
|
||||||
+ '(https://github.com/nlohmann/json/blob/develop/.github/CONTRIBUTING.md#amalgamate-the-source-code).'
|
+ '(https://github.com/nlohmann/json/blob/develop/.github/CONTRIBUTING.md#files-to-change).'
|
||||||
: '')
|
: '')
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -9,10 +9,6 @@
|
|||||||
name: 'Dependency Review'
|
name: 'Dependency Review'
|
||||||
on: [pull_request]
|
on: [pull_request]
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -21,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,6 @@
|
|||||||
|
|
||||||
name: flawfinder
|
name: flawfinder
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -31,7 +27,7 @@ jobs:
|
|||||||
security-events: write
|
security-events: write
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -47,6 +43,6 @@ jobs:
|
|||||||
output: 'flawfinder_results.sarif'
|
output: 'flawfinder_results.sarif'
|
||||||
|
|
||||||
- name: Upload analysis results to GitHub Security tab
|
- name: Upload analysis results to GitHub Security tab
|
||||||
uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/upload-sarif@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
with:
|
with:
|
||||||
sarif_file: ${{github.workspace}}/flawfinder_results.sarif
|
sarif_file: ${{github.workspace}}/flawfinder_results.sarif
|
||||||
|
|||||||
@@ -4,12 +4,6 @@ on:
|
|||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened, synchronize]
|
types: [opened, synchronize]
|
||||||
|
|
||||||
# pull_request_target runs on the base branch, so github.ref would put all pull
|
|
||||||
# requests into one group; group by pull request number instead
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -23,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ on:
|
|||||||
- develop
|
- develop
|
||||||
paths:
|
paths:
|
||||||
- docs/mkdocs/**
|
- docs/mkdocs/**
|
||||||
|
- docs/examples/**
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
# we don't want to have concurrent jobs, and we don't want to cancel running jobs to avoid broken publications
|
# we don't want to have concurrent jobs, and we don't want to cancel running jobs to avoid broken publications
|
||||||
@@ -26,7 +27,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,6 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches: ["develop"]
|
branches: ["develop"]
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -40,7 +36,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -80,6 +76,6 @@ jobs:
|
|||||||
|
|
||||||
# Upload the results to GitHub's code scanning dashboard.
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
- name: "Upload to code-scanning"
|
- name: "Upload to code-scanning"
|
||||||
uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/upload-sarif@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: '23 2 * * 4'
|
- cron: '23 2 * * 4'
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -36,7 +32,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -65,7 +61,7 @@ jobs:
|
|||||||
|
|
||||||
# Upload SARIF file generated in previous step
|
# Upload SARIF file generated in previous step
|
||||||
- name: Upload SARIF file
|
- name: Upload SARIF file
|
||||||
uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
|
uses: github/codeql-action/upload-sarif@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||||
with:
|
with:
|
||||||
sarif_file: semgrep.sarif
|
sarif_file: semgrep.sarif
|
||||||
if: always()
|
if: always()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ jobs:
|
|||||||
target: [ci_test_amalgamation, ci_test_single_header, ci_cppcheck, ci_cpplint, ci_reproducible_tests, ci_non_git_tests, ci_offline_testdata, ci_reuse_compliance, ci_test_valgrind]
|
target: [ci_test_amalgamation, ci_test_single_header, ci_cppcheck, ci_cpplint, ci_reproducible_tests, ci_non_git_tests, ci_offline_testdata, ci_reuse_compliance, ci_test_valgrind]
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ jobs:
|
|||||||
container: ubuntu:focal
|
container: ubuntu:focal
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
target: [ci_cmake_flags, ci_test_diagnostics, ci_test_diagnostic_positions, ci_test_noexceptions, ci_test_noimplicitconversions, ci_test_legacycomparison, ci_test_noglobaludls, ci_test_disableenumserialization, ci_test_skiplibraryversioncheck, ci_test_simdutf, ci_test_strict_nul_handling, ci_test_no_thread_local]
|
target: [ci_cmake_flags, ci_test_diagnostics, ci_test_diagnostic_positions, ci_test_noexceptions, ci_test_noimplicitconversions, ci_test_legacycomparison, ci_test_noglobaludls]
|
||||||
steps:
|
steps:
|
||||||
- name: Install build-essential
|
- name: Install build-essential
|
||||||
run: apt-get update ; apt-get install -y build-essential unzip wget git libssl-dev
|
run: apt-get update ; apt-get install -y build-essential unzip wget git libssl-dev
|
||||||
@@ -118,7 +118,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -369,7 +369,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
@@ -392,7 +392,7 @@ jobs:
|
|||||||
target: [ci_test_examples, ci_test_build_documentation]
|
target: [ci_test_examples, ci_test_build_documentation]
|
||||||
steps:
|
steps:
|
||||||
- name: Harden Runner
|
- name: Harden Runner
|
||||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
|
|||||||
@@ -124,11 +124,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
- name: Run CMake (Release)
|
- name: Run CMake (Release)
|
||||||
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ARM64 -DJSON_BuildTests=On -DCMAKE_CXX_FLAGS="/W4 /WX"
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -A ARM64 -DJSON_BuildTests=On -DCMAKE_CXX_FLAGS="/W4 /WX"
|
||||||
if: matrix.build_type == 'Release'
|
if: matrix.build_type == 'Release'
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Run CMake (Debug)
|
- name: Run CMake (Debug)
|
||||||
run: cmake -S . -B build -G "Visual Studio 18 2026" -A ARM64 -DJSON_BuildTests=On -DJSON_FastTests=ON -DCMAKE_CXX_FLAGS="/W4 /WX"
|
run: cmake -S . -B build -G "Visual Studio 17 2022" -A ARM64 -DJSON_BuildTests=On -DJSON_FastTests=ON -DCMAKE_CXX_FLAGS="/W4 /WX"
|
||||||
if: matrix.build_type == 'Debug'
|
if: matrix.build_type == 'Debug'
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Build
|
- name: Build
|
||||||
@@ -158,10 +158,6 @@ jobs:
|
|||||||
# to fit: IMAGE_REL_AMD64_SECREL against `.debug_line'" because the
|
# to fit: IMAGE_REL_AMD64_SECREL against `.debug_line'" because the
|
||||||
# MinGW linker cannot relocate the debug sections this test produces.
|
# MinGW linker cannot relocate the debug sections this test produces.
|
||||||
# The tests are only built and run here, so the debug info is not used.
|
# The tests are only built and run here, so the debug info is not used.
|
||||||
# Do not add -O1 here to shrink the objects further: it does make them
|
|
||||||
# link, but the binaries clang 11.0.1 and clang 18.1.8 then produce crash
|
|
||||||
# before doctest prints its first line - 39 of 102 tests on clang 18.
|
|
||||||
# Keep the objects small by splitting the test files instead.
|
|
||||||
- name: Run CMake
|
- name: Run CMake
|
||||||
run: cmake -S . -B build ^
|
run: cmake -S . -B build ^
|
||||||
-DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang++.exe" ^
|
-DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang++.exe" ^
|
||||||
|
|||||||
+1
-4
@@ -30,10 +30,8 @@ cc_library(
|
|||||||
"include/nlohmann/detail/input/input_adapters.hpp",
|
"include/nlohmann/detail/input/input_adapters.hpp",
|
||||||
"include/nlohmann/detail/input/json_sax.hpp",
|
"include/nlohmann/detail/input/json_sax.hpp",
|
||||||
"include/nlohmann/detail/input/lexer.hpp",
|
"include/nlohmann/detail/input/lexer.hpp",
|
||||||
"include/nlohmann/detail/input/number_parse.hpp",
|
|
||||||
"include/nlohmann/detail/input/parser.hpp",
|
"include/nlohmann/detail/input/parser.hpp",
|
||||||
"include/nlohmann/detail/input/position_t.hpp",
|
"include/nlohmann/detail/input/position_t.hpp",
|
||||||
"include/nlohmann/detail/input/string_scan.hpp",
|
|
||||||
"include/nlohmann/detail/iterators/internal_iterator.hpp",
|
"include/nlohmann/detail/iterators/internal_iterator.hpp",
|
||||||
"include/nlohmann/detail/iterators/iter_impl.hpp",
|
"include/nlohmann/detail/iterators/iter_impl.hpp",
|
||||||
"include/nlohmann/detail/iterators/iteration_proxy.hpp",
|
"include/nlohmann/detail/iterators/iteration_proxy.hpp",
|
||||||
@@ -51,14 +49,12 @@ cc_library(
|
|||||||
"include/nlohmann/detail/meta/detected.hpp",
|
"include/nlohmann/detail/meta/detected.hpp",
|
||||||
"include/nlohmann/detail/meta/identity_tag.hpp",
|
"include/nlohmann/detail/meta/identity_tag.hpp",
|
||||||
"include/nlohmann/detail/meta/is_sax.hpp",
|
"include/nlohmann/detail/meta/is_sax.hpp",
|
||||||
"include/nlohmann/detail/meta/logic.hpp",
|
|
||||||
"include/nlohmann/detail/meta/std_fs.hpp",
|
"include/nlohmann/detail/meta/std_fs.hpp",
|
||||||
"include/nlohmann/detail/meta/type_traits.hpp",
|
"include/nlohmann/detail/meta/type_traits.hpp",
|
||||||
"include/nlohmann/detail/meta/void_t.hpp",
|
"include/nlohmann/detail/meta/void_t.hpp",
|
||||||
"include/nlohmann/detail/output/binary_writer.hpp",
|
"include/nlohmann/detail/output/binary_writer.hpp",
|
||||||
"include/nlohmann/detail/output/output_adapters.hpp",
|
"include/nlohmann/detail/output/output_adapters.hpp",
|
||||||
"include/nlohmann/detail/output/serializer.hpp",
|
"include/nlohmann/detail/output/serializer.hpp",
|
||||||
"include/nlohmann/detail/recursion_depth_limit.hpp",
|
|
||||||
"include/nlohmann/detail/string_concat.hpp",
|
"include/nlohmann/detail/string_concat.hpp",
|
||||||
"include/nlohmann/detail/string_escape.hpp",
|
"include/nlohmann/detail/string_escape.hpp",
|
||||||
"include/nlohmann/detail/string_utils.hpp",
|
"include/nlohmann/detail/string_utils.hpp",
|
||||||
@@ -71,6 +67,7 @@ cc_library(
|
|||||||
],
|
],
|
||||||
includes = ["include"],
|
includes = ["include"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
|
alwayslink = True,
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ option(JSON_LegacyDiscardedValueComparison "Enable legacy discarded value compar
|
|||||||
option(JSON_Install "Install CMake targets during install step." ${MAIN_PROJECT})
|
option(JSON_Install "Install CMake targets during install step." ${MAIN_PROJECT})
|
||||||
option(JSON_MultipleHeaders "Use non-amalgamated version of the library." ON)
|
option(JSON_MultipleHeaders "Use non-amalgamated version of the library." ON)
|
||||||
option(JSON_SystemInclude "Include as system headers (skip for clang-tidy)." OFF)
|
option(JSON_SystemInclude "Include as system headers (skip for clang-tidy)." OFF)
|
||||||
option(JSON_StrictNulHandling "Build with strict NUL-byte handling enabled." OFF)
|
|
||||||
|
|
||||||
if (JSON_CI)
|
if (JSON_CI)
|
||||||
include(ci)
|
include(ci)
|
||||||
@@ -109,10 +108,6 @@ if (JSON_Diagnostics)
|
|||||||
message(STATUS "Diagnostics enabled (JSON_DIAGNOSTICS=1)")
|
message(STATUS "Diagnostics enabled (JSON_DIAGNOSTICS=1)")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (JSON_StrictNulHandling)
|
|
||||||
message(STATUS "Strict NUL-byte handling enabled (JSON_STRICT_NUL_HANDLING=1)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (JSON_Diagnostic_Positions)
|
if (JSON_Diagnostic_Positions)
|
||||||
message(STATUS "Diagnostic positions enabled (JSON_DIAGNOSTIC_POSITIONS=1)")
|
message(STATUS "Diagnostic positions enabled (JSON_DIAGNOSTIC_POSITIONS=1)")
|
||||||
endif()
|
endif()
|
||||||
@@ -146,7 +141,6 @@ target_compile_definitions(
|
|||||||
$<$<BOOL:${JSON_Diagnostics}>:JSON_DIAGNOSTICS=1>
|
$<$<BOOL:${JSON_Diagnostics}>:JSON_DIAGNOSTICS=1>
|
||||||
$<$<BOOL:${JSON_Diagnostic_Positions}>:JSON_DIAGNOSTIC_POSITIONS=1>
|
$<$<BOOL:${JSON_Diagnostic_Positions}>:JSON_DIAGNOSTIC_POSITIONS=1>
|
||||||
$<$<BOOL:${JSON_LegacyDiscardedValueComparison}>:JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON=1>
|
$<$<BOOL:${JSON_LegacyDiscardedValueComparison}>:JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON=1>
|
||||||
$<$<BOOL:${JSON_StrictNulHandling}>:JSON_STRICT_NUL_HANDLING=1>
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
|
|||||||
@@ -250,16 +250,12 @@ Further documentation:
|
|||||||
|
|
||||||
### `BUILD.bazel`
|
### `BUILD.bazel`
|
||||||
|
|
||||||
The build definition for [Bazel](https://bazel.build). The file is generated by
|
The file can be updated by calling
|
||||||
`cmake/scripts/gen_bazel_build_file.cmake`, which derives the header list from the files in `include`; change the
|
|
||||||
script rather than editing the file by hand. The file can be updated by calling
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
make BUILD.bazel
|
make BUILD.bazel
|
||||||
```
|
```
|
||||||
|
|
||||||
The "Check amalgamation" workflow fails if the file is out of date.
|
|
||||||
|
|
||||||
### `meson.build`
|
### `meson.build`
|
||||||
|
|
||||||
The build definition for the [Meson](https://mesonbuild.com) build system.
|
The build definition for the [Meson](https://mesonbuild.com) build system.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.PHONY: pretty clean ChangeLog.md release update_hedley update_hedley_undef BUILD.bazel
|
.PHONY: pretty clean ChangeLog.md release
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# configuration
|
# configuration
|
||||||
@@ -30,9 +30,8 @@ AMALGAMATED_FWD_FILE=single_include/nlohmann/json_fwd.hpp
|
|||||||
# main target
|
# main target
|
||||||
all:
|
all:
|
||||||
@echo "amalgamate - amalgamate files single_include/nlohmann/json{,_fwd}.hpp from the include/nlohmann sources"
|
@echo "amalgamate - amalgamate files single_include/nlohmann/json{,_fwd}.hpp from the include/nlohmann sources"
|
||||||
@echo "BUILD.bazel - regenerate the Bazel BUILD file from the include/nlohmann sources"
|
|
||||||
@echo "ChangeLog.md - generate ChangeLog file"
|
@echo "ChangeLog.md - generate ChangeLog file"
|
||||||
@echo "check-amalgamation - check whether sources have been amalgamated and BUILD.bazel is up to date"
|
@echo "check-amalgamation - check whether sources have been amalgamated"
|
||||||
@echo "clean - remove built files"
|
@echo "clean - remove built files"
|
||||||
@echo "doctest - compile example files and check their output"
|
@echo "doctest - compile example files and check their output"
|
||||||
@echo "fuzz_testing - prepare fuzz testing of the JSON parser"
|
@echo "fuzz_testing - prepare fuzz testing of the JSON parser"
|
||||||
@@ -42,8 +41,6 @@ all:
|
|||||||
@echo "fuzz_testing_ubjson - prepare fuzz testing of the UBJSON parser"
|
@echo "fuzz_testing_ubjson - prepare fuzz testing of the UBJSON parser"
|
||||||
@echo "pretty - beautify code with Artistic Style"
|
@echo "pretty - beautify code with Artistic Style"
|
||||||
@echo "run_benchmarks - build and run benchmarks"
|
@echo "run_benchmarks - build and run benchmarks"
|
||||||
@echo "update_hedley - download Hedley and regenerate hedley.hpp / hedley_undef.hpp"
|
|
||||||
@echo "update_hedley_undef - rebuild hedley_undef.hpp from the JSON_HEDLEY_* #define names in hedley.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
@@ -173,13 +170,8 @@ check-amalgamation:
|
|||||||
@diff $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_FWD_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE) ; false)
|
@diff $(AMALGAMATED_FWD_FILE) $(AMALGAMATED_FWD_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE) ; false)
|
||||||
@mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE)
|
@mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE)
|
||||||
@mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE)
|
@mv $(AMALGAMATED_FWD_FILE)~ $(AMALGAMATED_FWD_FILE)
|
||||||
@mv BUILD.bazel BUILD.bazel~
|
|
||||||
@$(MAKE) BUILD.bazel
|
|
||||||
@diff BUILD.bazel BUILD.bazel~ || (echo "===================================================================\n BUILD.bazel is out of date! Please run 'make BUILD.bazel'.\n===================================================================" ; mv BUILD.bazel~ BUILD.bazel ; false)
|
|
||||||
@mv BUILD.bazel~ BUILD.bazel
|
|
||||||
|
|
||||||
# generate the Bazel BUILD file; phony, because a removed header would not trigger a rebuild
|
BUILD.bazel: $(SRCS)
|
||||||
BUILD.bazel:
|
|
||||||
cmake -P cmake/scripts/gen_bazel_build_file.cmake
|
cmake -P cmake/scripts/gen_bazel_build_file.cmake
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
@@ -249,24 +241,11 @@ update_hedley:
|
|||||||
rm -f include/nlohmann/thirdparty/hedley/hedley.hpp include/nlohmann/thirdparty/hedley/hedley_undef.hpp
|
rm -f include/nlohmann/thirdparty/hedley/hedley.hpp include/nlohmann/thirdparty/hedley/hedley_undef.hpp
|
||||||
curl https://raw.githubusercontent.com/nemequ/hedley/master/hedley.h -o include/nlohmann/thirdparty/hedley/hedley.hpp
|
curl https://raw.githubusercontent.com/nemequ/hedley/master/hedley.h -o include/nlohmann/thirdparty/hedley/hedley.hpp
|
||||||
$(SED) -i 's/HEDLEY_/JSON_HEDLEY_/g' include/nlohmann/thirdparty/hedley/hedley.hpp
|
$(SED) -i 's/HEDLEY_/JSON_HEDLEY_/g' include/nlohmann/thirdparty/hedley/hedley.hpp
|
||||||
|
grep "[[:blank:]]*#[[:blank:]]*undef" include/nlohmann/thirdparty/hedley/hedley.hpp | grep -v "__" | sort | uniq | $(SED) 's/ //g' | $(SED) 's/undef/undef /g' > include/nlohmann/thirdparty/hedley/hedley_undef.hpp
|
||||||
$(SED) -i '1s/^/#pragma once\n\n/' include/nlohmann/thirdparty/hedley/hedley.hpp
|
$(SED) -i '1s/^/#pragma once\n\n/' include/nlohmann/thirdparty/hedley/hedley.hpp
|
||||||
$(MAKE) update_hedley_undef
|
$(SED) -i '1s/^/#pragma once\n\n/' include/nlohmann/thirdparty/hedley/hedley_undef.hpp
|
||||||
$(MAKE) amalgamate
|
$(MAKE) amalgamate
|
||||||
|
|
||||||
# Rebuild hedley_undef.hpp from every JSON_HEDLEY_* name that hedley.hpp
|
|
||||||
# #defines. Hedley does not #undef all of its public macros internally (see
|
|
||||||
# #5408), so grepping those #undef lines misses names such as
|
|
||||||
# JSON_HEDLEY_PRAGMA. cmake/scripts/gen_hedley_undef_check.cmake is the
|
|
||||||
# single source of truth for this extraction (tests/CMakeLists.txt uses the
|
|
||||||
# same script, in MODE=checks, to generate the matching leak-check test), so
|
|
||||||
# the vendored header, the generated #undef list, and the regression test
|
|
||||||
# cannot drift apart.
|
|
||||||
update_hedley_undef:
|
|
||||||
cmake -DHEDLEY_HPP=include/nlohmann/thirdparty/hedley/hedley.hpp \
|
|
||||||
-DOUTPUT=include/nlohmann/thirdparty/hedley/hedley_undef.hpp \
|
|
||||||
-DMODE=undef \
|
|
||||||
-P cmake/scripts/gen_hedley_undef_check.cmake
|
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# serve_header.py
|
# serve_header.py
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
[](https://github.com/nlohmann/json/releases)
|
[](https://github.com/nlohmann/json/releases)
|
||||||
[](https://github.com/nlohmann/json/issues)
|
[](https://github.com/nlohmann/json/issues)
|
||||||
[](https://isitmaintained.com/project/nlohmann/json "Average time to resolve an issue")
|
[](https://isitmaintained.com/project/nlohmann/json "Average time to resolve an issue")
|
||||||
[](https://www.bestpractices.dev/projects/289)
|
[](https://bestpractices.coreinfrastructure.org/projects/289)
|
||||||
[](https://scorecard.dev/viewer/?uri=github.com/nlohmann/json)
|
[](https://scorecard.dev/viewer/?uri=github.com/nlohmann/json)
|
||||||
[](https://cloudback.it)
|
[](https://cloudback.it)
|
||||||
[](https://github.com/sponsors/nlohmann)
|
[](https://github.com/sponsors/nlohmann)
|
||||||
@@ -63,7 +63,7 @@ There are myriads of [JSON](https://json.org) libraries out there, and each may
|
|||||||
|
|
||||||
- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. The library is also included in all popular [package managers](https://json.nlohmann.me/integration/package_managers/).
|
- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. The library is also included in all popular [package managers](https://json.nlohmann.me/integration/package_managers/).
|
||||||
|
|
||||||
- **Serious testing**. Our code is heavily [unit-tested](https://github.com/nlohmann/json/tree/develop/tests/src) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](https://valgrind.org) and the [Clang Sanitizers](https://clang.llvm.org/docs/index.html) that there are no memory leaks. [Google OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json) additionally runs fuzz tests against all parsers 24/7, effectively executing billions of tests so far. To maintain high quality, the project is following the [OpenSSF Best Practices](https://www.bestpractices.dev/projects/289). See the [quality assurance](https://json.nlohmann.me/community/quality_assurance) overview documentation.
|
- **Serious testing**. Our code is heavily [unit-tested](https://github.com/nlohmann/json/tree/develop/tests/src) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](https://valgrind.org) and the [Clang Sanitizers](https://clang.llvm.org/docs/index.html) that there are no memory leaks. [Google OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json) additionally runs fuzz tests against all parsers 24/7, effectively executing billions of tests so far. To maintain high quality, the project is following the [Core Infrastructure Initiative (CII) best practices](https://bestpractices.coreinfrastructure.org/projects/289). See the [quality assurance](https://json.nlohmann.me/community/quality_assurance) overview documentation.
|
||||||
|
|
||||||
Other aspects were not so important to us:
|
Other aspects were not so important to us:
|
||||||
|
|
||||||
@@ -1421,7 +1421,7 @@ I deeply appreciate the help of the following people.
|
|||||||
6. [Joshua C. Randall](https://github.com/jrandall) fixed a bug in the floating-point serialization.
|
6. [Joshua C. Randall](https://github.com/jrandall) fixed a bug in the floating-point serialization.
|
||||||
7. [Aaron Burghardt](https://github.com/aburgh) implemented code to parse streams incrementally. Furthermore, he greatly improved the parser class by allowing the definition of a filter function to discard undesired elements while parsing.
|
7. [Aaron Burghardt](https://github.com/aburgh) implemented code to parse streams incrementally. Furthermore, he greatly improved the parser class by allowing the definition of a filter function to discard undesired elements while parsing.
|
||||||
8. [Daniel Kopeček](https://github.com/dkopecek) fixed a bug in the compilation with GCC 5.0.
|
8. [Daniel Kopeček](https://github.com/dkopecek) fixed a bug in the compilation with GCC 5.0.
|
||||||
9. [Fiona Johanna Weber](https://github.com/Fiona-J-W) fixed a bug in and improved the performance of the comparison operators.
|
9. [Florian Weber](https://github.com/Florianjw) fixed a bug in and improved the performance of the comparison operators.
|
||||||
10. [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping.
|
10. [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping.
|
||||||
11. [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums.
|
11. [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums.
|
||||||
12. [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual Studio.
|
12. [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual Studio.
|
||||||
@@ -1523,14 +1523,14 @@ I deeply appreciate the help of the following people.
|
|||||||
108. [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake.
|
108. [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake.
|
||||||
109. [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io).
|
109. [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io).
|
||||||
110. [Carlos O'Ryan](https://github.com/coryan) fixed a typo.
|
110. [Carlos O'Ryan](https://github.com/coryan) fixed a typo.
|
||||||
111. [James Upjohn](https://github.com/jupjohn) fixed a version number in the compilers section.
|
111. [James Upjohn](https://github.com/jammehcow) fixed a version number in the compilers section.
|
||||||
112. [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines and provided documentation for the CMake integration.
|
112. [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines and provided documentation for the CMake integration.
|
||||||
113. [Jan Schöppach](https://github.com/dns13) fixed a typo.
|
113. [Jan Schöppach](https://github.com/dns13) fixed a typo.
|
||||||
114. [martin-mfg](https://github.com/martin-mfg) fixed a typo.
|
114. [martin-mfg](https://github.com/martin-mfg) fixed a typo.
|
||||||
115. [Matthias Möller](https://github.com/TinyTinni) removed the dependency from `std::stringstream`.
|
115. [Matthias Möller](https://github.com/TinyTinni) removed the dependency from `std::stringstream`.
|
||||||
116. [agrianius](https://github.com/agrianius) added code to use alternative string implementations.
|
116. [agrianius](https://github.com/agrianius) added code to use alternative string implementations.
|
||||||
117. [Daniel599](https://github.com/Daniel599) allowed to use more algorithms with the `items()` function.
|
117. [Daniel599](https://github.com/Daniel599) allowed to use more algorithms with the `items()` function.
|
||||||
118. [Julius Rakow](https://github.com/juliusrakow) fixed the Meson include directory and fixed the links to [cppreference.com](https://cppreference.com).
|
118. [Julius Rakow](https://github.com/jrakow) fixed the Meson include directory and fixed the links to [cppreference.com](https://cppreference.com).
|
||||||
119. [Sonu Lohani](https://github.com/sonulohani) fixed the compilation with MSVC 2015 in debug mode.
|
119. [Sonu Lohani](https://github.com/sonulohani) fixed the compilation with MSVC 2015 in debug mode.
|
||||||
120. [grembo](https://github.com/grembo) fixed the test suite and re-enabled several test cases.
|
120. [grembo](https://github.com/grembo) fixed the test suite and re-enabled several test cases.
|
||||||
121. [Hyeon Kim](https://github.com/simnalamburt) introduced the macro `JSON_INTERNAL_CATCH` to control the exception handling inside the library.
|
121. [Hyeon Kim](https://github.com/simnalamburt) introduced the macro `JSON_INTERNAL_CATCH` to control the exception handling inside the library.
|
||||||
@@ -1581,7 +1581,7 @@ I deeply appreciate the help of the following people.
|
|||||||
166. [Mark Beckwith](https://github.com/wythe) fixed a typo.
|
166. [Mark Beckwith](https://github.com/wythe) fixed a typo.
|
||||||
167. [yann-morin-1998](https://github.com/yann-morin-1998) helped to reduce the CMake requirement to version 3.1.
|
167. [yann-morin-1998](https://github.com/yann-morin-1998) helped to reduce the CMake requirement to version 3.1.
|
||||||
168. [Konstantin Podsvirov](https://github.com/podsvirov) maintains a package for the MSYS2 software distro.
|
168. [Konstantin Podsvirov](https://github.com/podsvirov) maintains a package for the MSYS2 software distro.
|
||||||
169. [remyabel](https://github.com/remyabel2) added GNUInstallDirs to the CMake files.
|
169. [remyabel](https://github.com/remyabel) added GNUInstallDirs to the CMake files.
|
||||||
170. [Taylor Howard](https://github.com/taylorhoward92) fixed a unit test.
|
170. [Taylor Howard](https://github.com/taylorhoward92) fixed a unit test.
|
||||||
171. [Gabe Ron](https://github.com/Macr0Nerd) implemented the `to_string` method.
|
171. [Gabe Ron](https://github.com/Macr0Nerd) implemented the `to_string` method.
|
||||||
172. [Watal M. Iwasaki](https://github.com/heavywatal) fixed a Clang warning.
|
172. [Watal M. Iwasaki](https://github.com/heavywatal) fixed a Clang warning.
|
||||||
@@ -1608,7 +1608,7 @@ I deeply appreciate the help of the following people.
|
|||||||
193. [Hubert Chathi](https://github.com/uhoreg) made CMake's version config file architecture-independent.
|
193. [Hubert Chathi](https://github.com/uhoreg) made CMake's version config file architecture-independent.
|
||||||
194. [OmnipotentEntity](https://github.com/OmnipotentEntity) implemented the binary values for CBOR, MessagePack, BSON, and UBJSON.
|
194. [OmnipotentEntity](https://github.com/OmnipotentEntity) implemented the binary values for CBOR, MessagePack, BSON, and UBJSON.
|
||||||
195. [ArtemSarmini](https://github.com/ArtemSarmini) fixed a compilation issue with GCC 10 and fixed a leak.
|
195. [ArtemSarmini](https://github.com/ArtemSarmini) fixed a compilation issue with GCC 10 and fixed a leak.
|
||||||
196. [Evgenii Sopov](https://github.com/sea5kg) integrated the library to the wsjcpp package manager.
|
196. [Evgenii Sopov](https://github.com/sea-kg) integrated the library to the wsjcpp package manager.
|
||||||
197. [Sergey Linev](https://github.com/linev) fixed a compiler warning.
|
197. [Sergey Linev](https://github.com/linev) fixed a compiler warning.
|
||||||
198. [Miguel Magalhães](https://github.com/magamig) fixed the year in the copyright.
|
198. [Miguel Magalhães](https://github.com/magamig) fixed the year in the copyright.
|
||||||
199. [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) fixed a compilation issue with MSVC.
|
199. [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) fixed a compilation issue with MSVC.
|
||||||
@@ -1702,7 +1702,7 @@ I deeply appreciate the help of the following people.
|
|||||||
287. [NN](https://github.com/NN---) added the Visual Studio output directory to `.gitignore`.
|
287. [NN](https://github.com/NN---) added the Visual Studio output directory to `.gitignore`.
|
||||||
288. [Romain Reignier](https://github.com/romainreignier) improved the performance of the vector output adapter.
|
288. [Romain Reignier](https://github.com/romainreignier) improved the performance of the vector output adapter.
|
||||||
289. [Mike](https://github.com/Mike-Leo-Smith) fixed the `std::iterator_traits`.
|
289. [Mike](https://github.com/Mike-Leo-Smith) fixed the `std::iterator_traits`.
|
||||||
290. [Richard Hozák](https://github.com/richardhozak) added macro `JSON_NO_ENUM` to disable default enum conversions.
|
290. [Richard Hozák](https://github.com/zxey) added macro `JSON_NO_ENUM` to disable default enum conversions.
|
||||||
291. [vakokako](https://github.com/vakokako) fixed tests when compiling with C++20.
|
291. [vakokako](https://github.com/vakokako) fixed tests when compiling with C++20.
|
||||||
292. [Alexander “weej” Jones](https://github.com/alexweej) fixed an example in the README.
|
292. [Alexander “weej” Jones](https://github.com/alexweej) fixed an example in the README.
|
||||||
293. [Eli Schwartz](https://github.com/eli-schwartz) added more files to the `include.zip` archive.
|
293. [Eli Schwartz](https://github.com/eli-schwartz) added more files to the `include.zip` archive.
|
||||||
@@ -1727,7 +1727,7 @@ I deeply appreciate the help of the following people.
|
|||||||
312. [Gareth Sylvester-Bradley](https://github.com/garethsb) added `operator/=` and `operator/` to construct JSON pointers.
|
312. [Gareth Sylvester-Bradley](https://github.com/garethsb) added `operator/=` and `operator/` to construct JSON pointers.
|
||||||
313. [Michael Macnair](https://github.com/mykter) added support for afl-fuzz testing.
|
313. [Michael Macnair](https://github.com/mykter) added support for afl-fuzz testing.
|
||||||
314. [Berkus Decker](https://github.com/berkus) fixed a typo in the README.
|
314. [Berkus Decker](https://github.com/berkus) fixed a typo in the README.
|
||||||
315. [Illia Polishchuk](https://github.com/ilqvya) improved the CMake testing.
|
315. [Illia Polishchuk](https://github.com/effolkronium) improved the CMake testing.
|
||||||
316. [Ikko Ashimine](https://github.com/eltociear) fixed a typo.
|
316. [Ikko Ashimine](https://github.com/eltociear) fixed a typo.
|
||||||
317. [Raphael Grimm](https://github.com/barcode) added the possibility to define a custom base class.
|
317. [Raphael Grimm](https://github.com/barcode) added the possibility to define a custom base class.
|
||||||
318. [tocic](https://github.com/tocic) fixed typos in the documentation.
|
318. [tocic](https://github.com/tocic) fixed typos in the documentation.
|
||||||
@@ -1797,66 +1797,6 @@ I deeply appreciate the help of the following people.
|
|||||||
382. [bitFiedler](https://github.com/bitFiedler) made GDB pretty printer work with Python 3.8.
|
382. [bitFiedler](https://github.com/bitFiedler) made GDB pretty printer work with Python 3.8.
|
||||||
383. [Gianfranco Costamagna](https://github.com/LocutusOfBorg) fixed a compiler warning.
|
383. [Gianfranco Costamagna](https://github.com/LocutusOfBorg) fixed a compiler warning.
|
||||||
384. [risa2000](https://github.com/risa2000) made `std::filesystem::path` conversion to/from UTF-8 encoded string explicit.
|
384. [risa2000](https://github.com/risa2000) made `std::filesystem::path` conversion to/from UTF-8 encoded string explicit.
|
||||||
385. [AM](https://github.com/maqnouch) fixed typos in the README.
|
|
||||||
386. [dmenendez-gruposantander](https://github.com/dmenendez-gruposantander) fixed typos in the comments of the examples.
|
|
||||||
387. [Mihai Stan](https://github.com/mstan-xx) fixed comparisons against the literal `0`.
|
|
||||||
388. [Matt Gumbel](https://github.com/intelmatt) fixed some `-Weffc++` warnings.
|
|
||||||
389. [vimpunk](https://github.com/vimpunk) moved a lambda out of an unevaluated context to support older compilers.
|
|
||||||
390. [Chris Harris](https://github.com/cjh1) fixed the compilation with GCC 4.8.
|
|
||||||
391. [Palmer Dabbelt](https://github.com/palmer-dabbelt) generated and installed a pkg-config file.
|
|
||||||
392. [Gus Pozuelo](https://github.com/ap-viavi) made `ordered_map` compatible with GCC 5.5, Clang 3.6, and Xcode 9.
|
|
||||||
393. [AK](https://github.com/Lioncky) fixed an MSVC build error caused by the `min`/`max` macros from `windows.h`.
|
|
||||||
394. [Sergiu Deitsch](https://github.com/sergiud) provided a fallback for missing `char8_t` support.
|
|
||||||
395. [Xiaochuan Ye](https://github.com/XueSongTap) fixed `from_msgpack` for `std::byte` input by specializing `std::char_traits`.
|
|
||||||
396. [Ville Vesilehto](https://github.com/thevilledev) fixed an overflow in the BJData size calculation and rejected overflowing negative integers in CBOR.
|
|
||||||
397. [NmPassTHFan](https://github.com/nmpassthf) replaced the deprecated `std::is_trivial` for C++26.
|
|
||||||
398. [Chris Ever](https://github.com/chirsz-ever) added the `ignore_trailing_commas` parser option.
|
|
||||||
399. [Kuan-Fu Wu](https://github.com/kfwu1999) fixed the example code for `json_pointer` initialization.
|
|
||||||
400. [David Kilzer](https://github.com/ddkilzer) added a missing header to the input adapters.
|
|
||||||
401. [Miko](https://github.com/mikomikotaishi) added proper C++20 module support, simplified the module API, and fixed missing exports.
|
|
||||||
402. [hitgirl](https://github.com/hitgil) fixed the CMake configuration when cross-compiling.
|
|
||||||
403. [Devon Thomas](https://github.com/ThomaDevOSU) mentioned the Artistic Style formatting in the contribution guidelines.
|
|
||||||
404. [Erik Hu](https://github.com/Erikhu1) made Coveralls upload errors non-fatal in the CI.
|
|
||||||
405. [co63oc](https://github.com/co63oc) fixed typos.
|
|
||||||
406. [DmitriBogdanov](https://github.com/DmitriBogdanov) fixed broken package manager links in the documentation.
|
|
||||||
407. [Bander](https://github.com/banderzhm) improved the MSVC compatibility of the C++ modules.
|
|
||||||
408. [Andy Choi](https://github.com/ccpong) removed an unnecessary `template` keyword before `get` in the README and the documentation.
|
|
||||||
409. [SamareshSingh](https://github.com/ssam18) fixed single-element brace initialization to copy/move instead of wrapping in an array, fixed the `WITH_DEFAULT` macros for `ordered_map`, and handled moved events in `serve_header.py`.
|
|
||||||
410. [Aditya](https://github.com/Lumowhisp) improved the documentation of the documentation generation.
|
|
||||||
411. [cheese1](https://github.com/cheese1) clarified the README.
|
|
||||||
412. [KhloodElhossiny](https://github.com/khloodelhossiny) enabled `std::string_view` keys in `operator[]`.
|
|
||||||
413. [Charles Cabergs](https://github.com/cacharle) fixed a `-Wtautological-constant-out-of-range-compare` warning.
|
|
||||||
414. [EALePain](https://github.com/EALePain) made the `std::tuple` conversion work with reference types such as `std::tie`.
|
|
||||||
415. [koala_oishi](https://github.com/chibi-dogs) fixed grammatical wording in the README.
|
|
||||||
416. [riccardoori11](https://github.com/riccardoori11) fixed a typo in the documentation.
|
|
||||||
417. [Swastik Bose](https://github.com/VasuBhakt) fixed the parent pointers after `update()` with `JSON_DIAGNOSTICS` and fixed the Doxygen autolinking of requirements.
|
|
||||||
418. [trdesilva](https://github.com/trdesilva) added `front`, `pop_front`, and `push_front` to `json_pointer`.
|
|
||||||
419. [Akhilesh Arora](https://github.com/akhilesharora) fixed an incomplete-type error with `ordered_json`.
|
|
||||||
420. [Hariom Phulre](https://github.com/hariomphulre) fixed the C++20 modules compilation with GCC.
|
|
||||||
421. [Kirill Lokotkov](https://github.com/RUSLoker) fixed printing `long double` values.
|
|
||||||
422. [George Sedov](https://github.com/radistmorse) added the `NLOHMANN_DEFINE_TYPE_*_WITH_NAMES` macros.
|
|
||||||
423. [Caillin Nugent](https://github.com/nugentcaillin) added the `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` macro.
|
|
||||||
424. [Cosmin D.](https://github.com/drcosmin) fixed `std::filesystem::path` conversions and added an MSVC workaround for `std::unique_ptr`.
|
|
||||||
425. [Paul Dreik](https://github.com/pauldreik) fixed a test relying on implementation-specific behavior.
|
|
||||||
426. [Daniel Falk](https://github.com/daniel-falk) added missing copyright notices to the SBOM.
|
|
||||||
427. [Federico Sfriso](https://github.com/federicosfriso05-dotcom) added support for constructing JSON values from C++20 range views.
|
|
||||||
428. [Luke Banicevic](https://github.com/banaboi) fixed corrupt BSON output for lengths exceeding `INT32_MAX`, cleaned up the BSON writer, and improved the documentation.
|
|
||||||
429. [Patrick Armstrong](https://github.com/Patrick10199) updated the CBOR references and the half-precision float assertions.
|
|
||||||
430. [Yash Bavadiya](https://github.com/xevrion) added checks to all BSON reads.
|
|
||||||
431. [hum4nBeing](https://github.com/hum4nBeing) fixed the overflow handling of high-precision numbers in UBJSON.
|
|
||||||
432. [tomatotomata](https://github.com/tomatotomata) added checks for reading CBOR tagged subtypes.
|
|
||||||
433. [YingqiDuan](https://github.com/YingqiDuan) documented the BSON interoperability.
|
|
||||||
434. [KBS](https://github.com/youdie006) documented the standards compliance and the strictness of `parse()` and `operator>>`.
|
|
||||||
435. [Petr Bělohlávek](https://github.com/petrbel) added Clang 21 and 22 to the CI.
|
|
||||||
436. [Dmitry Rantovov](https://github.com/darkdi) fixed the placement of a CBOR documentation block.
|
|
||||||
437. [ljcjclljc](https://github.com/ljcjclljc) fixed the comparison of large unsigned integers with signed integers.
|
|
||||||
438. [Sahil Kamate](https://github.com/sahilkamate03) fixed the handling of CBOR tags 0-5 and 21-23.
|
|
||||||
439. [Krishnanand G](https://github.com/Krishnanand-G) made the UBJSON writer reject `use_type` without `use_size`.
|
|
||||||
440. [whn](https://github.com/Whning0513) documented the lenient BSON input handling and corrected the complexity of `to_bson`.
|
|
||||||
441. [elix3r](https://github.com/22elix3r) fixed `update()` with `merge_objects` when merging a primitive into an object.
|
|
||||||
442. [Avionic Harshit](https://github.com/avionicharshit-byte) made `diff()` linear when an array shrinks.
|
|
||||||
443. [Qatadaha Bin Matloob](https://github.com/qatcod) fixed comparisons between integers and floats and fixed unparsable BJData output.
|
|
||||||
444. [Wu Shuwen](https://github.com/dajiaohuang) removed an unused include.
|
|
||||||
|
|
||||||
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
|
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
|
||||||
|
|
||||||
|
|||||||
+10
-83
@@ -213,38 +213,18 @@ add_custom_target(ci_test_legacycomparison
|
|||||||
)
|
)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Validate UTF-8 with simdutf.
|
# Enable brace-init copy semantics.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_custom_target(ci_test_simdutf
|
add_custom_target(ci_test_brace_init_copy_semantics
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
||||||
-DJSON_BuildTests=ON -DJSON_TestSimdutf=ON
|
-DJSON_BuildTests=ON -DJSON_FastTests=ON
|
||||||
# simdutf needs C++17, so the library falls back to its scalar validator
|
-DCMAKE_CXX_FLAGS=-DJSON_BRACE_INIT_COPY_SEMANTICS=1
|
||||||
# below that: build the suite at C++11 to cover the fallback with the macro
|
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_brace_init_copy_semantics
|
||||||
# defined, and at C++17 to run every test against simdutf itself
|
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_brace_init_copy_semantics
|
||||||
"-DJSON_TestStandards=11\;17"
|
COMMAND cd ${PROJECT_BINARY_DIR}/build_brace_init_copy_semantics && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_simdutf
|
COMMENT "Compile and test with brace-init copy semantics enabled"
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_simdutf
|
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_simdutf && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
|
||||||
COMMENT "Compile and test with simdutf UTF-8 validation enabled"
|
|
||||||
)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Enable strict NUL-byte handling.
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
add_custom_target(ci_test_strict_nul_handling
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
|
||||||
-DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_StrictNulHandling=ON
|
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_strict_nul_handling
|
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_strict_nul_handling
|
|
||||||
# unit-testsuites contains a fixture (a "1e308" test value) that relies on the
|
|
||||||
# legacy NUL-as-end-of-input behavior this macro disables; exclude it here, as
|
|
||||||
# it is expected to fail under strict NUL handling and is out of scope for it
|
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_strict_nul_handling && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure -E "test-testsuites"
|
|
||||||
COMMENT "Compile and test with strict NUL-byte handling enabled"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -262,59 +242,6 @@ add_custom_target(ci_test_noglobaludls
|
|||||||
COMMENT "Compile and test with global UDLs disabled"
|
COMMENT "Compile and test with global UDLs disabled"
|
||||||
)
|
)
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Disable enum serialization.
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
add_custom_target(ci_test_disableenumserialization
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
|
||||||
-DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_DisableEnumSerialization=ON
|
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_disableenumserialization
|
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_disableenumserialization
|
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_disableenumserialization && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
|
||||||
COMMENT "Compile and test with enum serialization disabled"
|
|
||||||
)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Skip the multiple-inclusion library version check.
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# tests/src/skip_library_version_check.cpp deliberately simulates a scenario
|
|
||||||
# (mixing two differently-versioned inclusions of the library in one
|
|
||||||
# translation unit) that unavoidably triggers the compiler's own "macro
|
|
||||||
# redefined" warning, so -- unlike the ci_test_* targets above -- it is
|
|
||||||
# compiled directly here, with a modest warning set, instead of being folded
|
|
||||||
# into the library's own -Weverything/-Werror unit test matrix.
|
|
||||||
add_custom_target(ci_test_skiplibraryversioncheck
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/skip_library_version_check
|
|
||||||
COMMAND ${CMAKE_CXX_COMPILER} -std=c++11 -Wall -Wextra
|
|
||||||
-I${PROJECT_SOURCE_DIR}/include
|
|
||||||
${PROJECT_SOURCE_DIR}/tests/src/skip_library_version_check.cpp
|
|
||||||
-o ${PROJECT_BINARY_DIR}/skip_library_version_check/skip_library_version_check
|
|
||||||
COMMAND ${PROJECT_BINARY_DIR}/skip_library_version_check/skip_library_version_check
|
|
||||||
COMMENT "Compile and run a translation unit simulating a mismatched library version, with JSON_SKIP_LIBRARY_VERSION_CHECK defined"
|
|
||||||
)
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Disable thread-local storage.
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# Without thread-local storage, copying and comparing cannot bound their
|
|
||||||
# descent and handle every object and array without the call stack. Those paths
|
|
||||||
# are otherwise only reached by values nested deeper than the bound, so this
|
|
||||||
# target is what runs the whole test suite through them.
|
|
||||||
add_custom_target(ci_test_no_thread_local
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DCMAKE_BUILD_TYPE=Debug -GNinja
|
|
||||||
-DJSON_BuildTests=ON
|
|
||||||
-DCMAKE_CXX_FLAGS=-DJSON_NO_THREAD_LOCAL
|
|
||||||
-S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_no_thread_local
|
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_no_thread_local
|
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_no_thread_local && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
|
|
||||||
COMMENT "Compile and test without thread-local storage"
|
|
||||||
)
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Coverage.
|
# Coverage.
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -367,7 +294,7 @@ file(GLOB_RECURSE INDENT_FILES
|
|||||||
${PROJECT_SOURCE_DIR}/tests/src/*.cpp
|
${PROJECT_SOURCE_DIR}/tests/src/*.cpp
|
||||||
${PROJECT_SOURCE_DIR}/tests/src/*.hpp
|
${PROJECT_SOURCE_DIR}/tests/src/*.hpp
|
||||||
${PROJECT_SOURCE_DIR}/tests/benchmarks/src/benchmarks.cpp
|
${PROJECT_SOURCE_DIR}/tests/benchmarks/src/benchmarks.cpp
|
||||||
${PROJECT_SOURCE_DIR}/docs/mkdocs/docs/examples/*.cpp
|
${PROJECT_SOURCE_DIR}/docs/examples/*.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(include_dir ${PROJECT_SOURCE_DIR}/single_include/nlohmann)
|
set(include_dir ${PROJECT_SOURCE_DIR}/single_include/nlohmann)
|
||||||
@@ -619,7 +546,7 @@ add_custom_target(ci_single_binaries
|
|||||||
add_custom_target(ci_benchmarks
|
add_custom_target(ci_benchmarks
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DCMAKE_BUILD_TYPE=Release -GNinja
|
-DCMAKE_BUILD_TYPE=Release -GNinja
|
||||||
-S${PROJECT_SOURCE_DIR}/tests/benchmarks -B${PROJECT_BINARY_DIR}/build_benchmarks
|
-S${PROJECT_SOURCE_DIR}/benchmarks -B${PROJECT_BINARY_DIR}/build_benchmarks
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_benchmarks --target json_benchmarks
|
COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_benchmarks --target json_benchmarks
|
||||||
COMMAND cd ${PROJECT_BINARY_DIR}/build_benchmarks && ./json_benchmarks
|
COMMAND cd ${PROJECT_BINARY_DIR}/build_benchmarks && ./json_benchmarks
|
||||||
COMMENT "Run benchmarks"
|
COMMENT "Run benchmarks"
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ if(CMAKE_CROSSCOMPILING)
|
|||||||
endif()
|
endif()
|
||||||
if(NOT DEFINED LIBCPP_VERSION_OUTPUT_CACHED)
|
if(NOT DEFINED LIBCPP_VERSION_OUTPUT_CACHED)
|
||||||
try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR
|
try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR
|
||||||
"${CMAKE_BINARY_DIR}" SOURCES "${CMAKE_CURRENT_LIST_DIR}/detect_libcpp_version.cpp"
|
"${CMAKE_BINARY_DIR}" SOURCES "${CMAKE_SOURCE_DIR}/cmake/detect_libcpp_version.cpp"
|
||||||
RUN_OUTPUT_VARIABLE LIBCPP_VERSION_OUTPUT
|
RUN_OUTPUT_VARIABLE LIBCPP_VERSION_OUTPUT
|
||||||
COMPILE_OUTPUT_VARIABLE LIBCPP_VERSION_COMPILE_OUTPUT
|
COMPILE_OUTPUT_VARIABLE LIBCPP_VERSION_COMPILE_OUTPUT
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,57 +1,24 @@
|
|||||||
# generate Bazel BUILD file
|
# generate Bazel BUILD file
|
||||||
#
|
|
||||||
# usage: cmake -P cmake/scripts/gen_bazel_build_file.cmake (or: make BUILD.bazel)
|
|
||||||
#
|
|
||||||
# The header list of the "json" target is derived from the files in include/. Everything else is fixed text below,
|
|
||||||
# so edit this script rather than BUILD.bazel.
|
|
||||||
|
|
||||||
get_filename_component(PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
|
set(PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/../..")
|
||||||
set(BUILD_FILE "${PROJECT_ROOT}/BUILD.bazel")
|
set(BUILD_FILE "${PROJECT_ROOT}/BUILD.bazel")
|
||||||
|
|
||||||
file(GLOB_RECURSE HEADERS LIST_DIRECTORIES false RELATIVE "${PROJECT_ROOT}" "${PROJECT_ROOT}/include/*.hpp")
|
file(GLOB_RECURSE HEADERS LIST_DIRECTORIES false RELATIVE "${PROJECT_ROOT}" "include/*.hpp")
|
||||||
list(SORT HEADERS)
|
|
||||||
|
|
||||||
set(CONTENT [=[
|
|
||||||
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
|
||||||
load("@rules_license//rules:license.bzl", "license")
|
|
||||||
|
|
||||||
package(
|
|
||||||
default_applicable_licenses = [":license"],
|
|
||||||
)
|
|
||||||
|
|
||||||
exports_files([
|
|
||||||
"LICENSE.MIT",
|
|
||||||
])
|
|
||||||
|
|
||||||
license(
|
|
||||||
name = "license",
|
|
||||||
license_kinds = ["@rules_license//licenses/spdx:MIT"],
|
|
||||||
license_text = "LICENSE.MIT",
|
|
||||||
)
|
|
||||||
|
|
||||||
|
file(WRITE "${BUILD_FILE}" [=[
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "json",
|
name = "json",
|
||||||
hdrs = [
|
hdrs = [
|
||||||
]=])
|
]=])
|
||||||
|
|
||||||
foreach(header ${HEADERS})
|
foreach(header ${HEADERS})
|
||||||
string(APPEND CONTENT " \"${header}\",\n")
|
file(APPEND "${BUILD_FILE}" " \"${header}\",\n")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
string(APPEND CONTENT [=[
|
file(APPEND "${BUILD_FILE}" [=[
|
||||||
],
|
],
|
||||||
includes = ["include"],
|
includes = ["include"],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
alwayslink = True,
|
||||||
|
|
||||||
cc_library(
|
|
||||||
name = "singleheader-json",
|
|
||||||
hdrs = [
|
|
||||||
"single_include/nlohmann/json.hpp",
|
|
||||||
],
|
|
||||||
includes = ["single_include"],
|
|
||||||
visibility = ["//visibility:public"],
|
|
||||||
)
|
)
|
||||||
]=])
|
]=])
|
||||||
|
|
||||||
file(WRITE "${BUILD_FILE}" "${CONTENT}")
|
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
# Shared extractor for the JSON_HEDLEY_* macro names defined in hedley.hpp.
|
|
||||||
#
|
|
||||||
# Every macro that hedley.hpp #defines must be #undef-ed again once json.hpp
|
|
||||||
# has been fully processed (see include/nlohmann/detail/macro_unscope.hpp
|
|
||||||
# and https://github.com/nlohmann/json/issues/5408). Deriving the macro list
|
|
||||||
# straight from hedley.hpp here -- instead of hand-maintaining it in two
|
|
||||||
# places -- means hedley_undef.hpp and the regression test that checks for
|
|
||||||
# leaked macros can never drift apart, even after a future `make
|
|
||||||
# update_hedley` pulls in new macros from upstream Hedley.
|
|
||||||
#
|
|
||||||
# MODE=undef (default): write hedley_undef.hpp (SPDX header, #pragma once,
|
|
||||||
# one #undef per macro name) -- used by `make update_hedley_undef`
|
|
||||||
# MODE=checks: write one #ifdef/FAIL_CHECK/#endif per macro name,
|
|
||||||
# meant to be #include-d inside a TEST_CASE -- used by
|
|
||||||
# tests/CMakeLists.txt to (re)generate the include for
|
|
||||||
# tests/src/unit-no-macro-leak.cpp
|
|
||||||
#
|
|
||||||
# Required variables:
|
|
||||||
# HEDLEY_HPP path to include/nlohmann/thirdparty/hedley/hedley.hpp
|
|
||||||
# OUTPUT path of the file to (over)write
|
|
||||||
# Optional:
|
|
||||||
# MODE "undef" (default) or "checks"
|
|
||||||
|
|
||||||
if(NOT DEFINED HEDLEY_HPP OR NOT DEFINED OUTPUT)
|
|
||||||
message(FATAL_ERROR "HEDLEY_HPP and OUTPUT must be set")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT EXISTS "${HEDLEY_HPP}")
|
|
||||||
message(FATAL_ERROR "Hedley header not found: ${HEDLEY_HPP}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED MODE)
|
|
||||||
set(MODE undef)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT MODE STREQUAL "undef" AND NOT MODE STREQUAL "checks")
|
|
||||||
message(FATAL_ERROR "MODE must be undef or checks, got: ${MODE}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Line-anchored, like `grep -oE "^[[:blank:]]*#[[:blank:]]*define[[:blank:]]+JSON_HEDLEY_[A-Za-z0-9_]+"`.
|
|
||||||
# Unanchored matching would also pick up JSON_HEDLEY_* mentions inside
|
|
||||||
# comments or string literals elsewhere in the file, which must not turn
|
|
||||||
# into #undef lines.
|
|
||||||
file(STRINGS "${HEDLEY_HPP}" hedley_lines)
|
|
||||||
set(macro_names)
|
|
||||||
foreach(line IN LISTS hedley_lines)
|
|
||||||
if("${line}" MATCHES "^[ \t]*#[ \t]*define[ \t]+(JSON_HEDLEY_[A-Za-z0-9_]+)")
|
|
||||||
list(APPEND macro_names "${CMAKE_MATCH_1}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if(NOT macro_names)
|
|
||||||
message(FATAL_ERROR "No JSON_HEDLEY_* macros found in ${HEDLEY_HPP}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(REMOVE_DUPLICATES macro_names)
|
|
||||||
# Lexicographic, locale-independent (ASCII-only names) -- matches `LC_ALL=C sort`.
|
|
||||||
list(SORT macro_names COMPARE STRING)
|
|
||||||
list(LENGTH macro_names macro_count)
|
|
||||||
|
|
||||||
set(generated "")
|
|
||||||
if(MODE STREQUAL "undef")
|
|
||||||
# Same banner `make update_hedley_undef` would stamp by hand, so the
|
|
||||||
# recipe is self-contained and its output is byte-stable across reruns.
|
|
||||||
# The embedded SPDX tags below are part of the *generated* file's
|
|
||||||
# content, not a REUSE header for this .cmake script itself (which is
|
|
||||||
# already covered by the blanket "Files: *" rule in .reuse/dep5) -- keep
|
|
||||||
# them wrapped in REUSE-IgnoreStart/End so `reuse lint` does not try to
|
|
||||||
# parse "MIT\n")" as this file's own SPDX-License-Identifier value.
|
|
||||||
# REUSE-IgnoreStart
|
|
||||||
string(APPEND generated "// __ _____ _____ _____\n")
|
|
||||||
string(APPEND generated "// __| | __| | | | JSON for Modern C++\n")
|
|
||||||
string(APPEND generated "// | | |__ | | | | | | version 3.12.0\n")
|
|
||||||
string(APPEND generated "// |_____|_____|_____|_|___| https://github.com/nlohmann/json\n")
|
|
||||||
string(APPEND generated "//\n")
|
|
||||||
string(APPEND generated "// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>\n")
|
|
||||||
string(APPEND generated "// SPDX-License-Identifier: MIT\n")
|
|
||||||
# REUSE-IgnoreEnd
|
|
||||||
string(APPEND generated "\n")
|
|
||||||
string(APPEND generated "#pragma once\n")
|
|
||||||
string(APPEND generated "\n")
|
|
||||||
foreach(name IN LISTS macro_names)
|
|
||||||
string(APPEND generated "#undef ${name}\n")
|
|
||||||
endforeach()
|
|
||||||
else()
|
|
||||||
string(APPEND generated "// This file is generated by cmake/scripts/gen_hedley_undef_check.cmake\n")
|
|
||||||
string(APPEND generated "// from include/nlohmann/thirdparty/hedley/hedley.hpp. Do not edit it by\n")
|
|
||||||
string(APPEND generated "// hand -- it is regenerated on every build. ${macro_count} macros checked.\n\n")
|
|
||||||
foreach(name IN LISTS macro_names)
|
|
||||||
string(APPEND generated "#ifdef ${name}\n")
|
|
||||||
string(APPEND generated " FAIL_CHECK(\"${name} leaked after including nlohmann/json.hpp\");\n")
|
|
||||||
string(APPEND generated "#endif\n")
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
get_filename_component(output_dir "${OUTPUT}" DIRECTORY)
|
|
||||||
if(output_dir)
|
|
||||||
file(MAKE_DIRECTORY "${output_dir}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Avoid rewriting the file (and busting downstream incremental rebuilds)
|
|
||||||
# when the content has not actually changed.
|
|
||||||
set(write_output TRUE)
|
|
||||||
if(EXISTS "${OUTPUT}")
|
|
||||||
file(READ "${OUTPUT}" existing_content)
|
|
||||||
if(existing_content STREQUAL generated)
|
|
||||||
set(write_output FALSE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(write_output)
|
|
||||||
file(WRITE "${OUTPUT}" "${generated}")
|
|
||||||
endif()
|
|
||||||
@@ -90,10 +90,6 @@ Linear in the length of the input. The parser is a predictive LL(1) parser.
|
|||||||
|
|
||||||
A UTF-8 byte order mark is silently ignored.
|
A UTF-8 byte order mark is silently ignored.
|
||||||
|
|
||||||
By default, a `'\0'` (NUL) byte anywhere in the input is treated as end of input, rather than as an ordinary (and,
|
|
||||||
outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-bytes-in-the-input) for details and the
|
|
||||||
[`JSON_STRICT_NUL_HANDLING`](../macros/json_strict_nul_handling.md) macro to opt into rejecting it instead.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
@@ -115,8 +111,6 @@ outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-by
|
|||||||
- [parse](parse.md) - deserialize from a compatible input
|
- [parse](parse.md) - deserialize from a compatible input
|
||||||
- [sax_parse](sax_parse.md) - parse input using the SAX interface
|
- [sax_parse](sax_parse.md) - parse input using the SAX interface
|
||||||
- [operator>>](../operator_gtgt.md) - deserialize from stream
|
- [operator>>](../operator_gtgt.md) - deserialize from stream
|
||||||
- [`JSON_STRICT_NUL_HANDLING`](../macros/json_strict_nul_handling.md) - opt in to rejecting a NUL byte in the input
|
|
||||||
instead of treating it as end of input
|
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
@@ -126,8 +120,6 @@ outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-by
|
|||||||
- Added `ignore_trailing_commas` in version 3.13.0.
|
- Added `ignore_trailing_commas` in version 3.13.0.
|
||||||
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
||||||
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
||||||
- `JSON_STRICT_NUL_HANDLING` added in version 3.13.0 to optionally reject a NUL byte in the input instead of treating
|
|
||||||
it as end of input; planned to become the default in version 4.0.0.
|
|
||||||
|
|
||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,7 @@ To store objects in C++, a type is defined by the template parameters explained
|
|||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
`ArrayType`
|
`ArrayType`
|
||||||
: container type to store arrays. It must be a vector-like container: the library uses `operator[]`, `at()`, and
|
: container type to store arrays (e.g., `std::vector` or `std::list`)
|
||||||
`resize()`, and requires random-access iterators. `#!cpp std::vector` and `#!cpp std::deque` qualify;
|
|
||||||
`#!cpp std::list` does not. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#arraytype) for the full list of
|
|
||||||
requirements.
|
|
||||||
|
|
||||||
`AllocatorType`
|
`AllocatorType`
|
||||||
: the allocator to use for objects (e.g., `std::allocator`)
|
: the allocator to use for objects (e.g., `std::allocator`)
|
||||||
@@ -70,4 +66,3 @@ Arrays are stored as pointers in a `basic_json` type. That is, for any access to
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 1.0.0.
|
- Added in version 1.0.0.
|
||||||
- Made `capacity()` optional, so that array types such as `#!cpp std::deque` can be used, in version 3.13.0.
|
|
||||||
|
|||||||
@@ -42,9 +42,7 @@ represent a byte array in modern C++.
|
|||||||
`value_type` must additionally be exactly one byte wide (e.g., `std::uint8_t`/`char`/`std::byte`): the binary
|
`value_type` must additionally be exactly one byte wide (e.g., `std::uint8_t`/`char`/`std::byte`): the binary
|
||||||
serializers (CBOR, MessagePack, BSON, UBJSON) read and write the container's raw bytes via
|
serializers (CBOR, MessagePack, BSON, UBJSON) read and write the container's raw bytes via
|
||||||
`reinterpret_cast`, which is only correct for byte-sized elements -- a container like
|
`reinterpret_cast`, which is only correct for byte-sized elements -- a container like
|
||||||
`#!cpp std::vector<std::intptr_t>` will not work as `BinaryType`. The elements must be stored contiguously, and
|
`#!cpp std::vector<std::intptr_t>` will not work as `BinaryType`.
|
||||||
the binary readers additionally require `resize()` and `operator[]`. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#binarytype) for the full list.
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@@ -52,11 +50,6 @@ represent a byte array in modern C++.
|
|||||||
|
|
||||||
The default values for `BinaryType` is `#!cpp std::vector<std::uint8_t>`.
|
The default values for `BinaryType` is `#!cpp std::vector<std::uint8_t>`.
|
||||||
|
|
||||||
#### Supported byte types
|
|
||||||
|
|
||||||
`#!cpp std::vector<std::uint8_t>`, `#!cpp std::vector<char>`, and `#!cpp std::vector<std::byte>` are supported.
|
|
||||||
Regardless of which of them is configured, [`dump`](dump.md) writes the bytes as the numbers 0..255.
|
|
||||||
|
|
||||||
#### Custom BinaryType behavior
|
#### Custom BinaryType behavior
|
||||||
|
|
||||||
When a custom `BinaryType` is configured (other than the default `#!cpp std::vector<std::uint8_t>`), you can assign
|
When a custom `BinaryType` is configured (other than the default `#!cpp std::vector<std::uint8_t>`), you can assign
|
||||||
@@ -133,6 +126,3 @@ type `#!cpp binary_t*` must be dereferenced.
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.8.0. Changed the type of subtype to `std::uint64_t` in version 3.10.0.
|
- Added in version 3.8.0. Changed the type of subtype to `std::uint64_t` in version 3.10.0.
|
||||||
- Fixed [`dump`](dump.md), [`std::hash`](std_hash.md), and [`to_ubjson`](to_ubjson.md) for byte types that are not
|
|
||||||
integers (e.g., `#!cpp std::byte`) in version 3.13.0. `dump` now writes the bytes of a signed byte type (e.g.,
|
|
||||||
`#!cpp char`) as 0..255 rather than as negative numbers.
|
|
||||||
|
|||||||
@@ -11,14 +11,6 @@ literals `#!json true` and `#!json false`.
|
|||||||
|
|
||||||
To store boolean values in C++, a type is defined by the template parameter `BooleanType` which chooses the type to use.
|
To store boolean values in C++, a type is defined by the template parameter `BooleanType` which chooses the type to use.
|
||||||
|
|
||||||
## Template parameters
|
|
||||||
|
|
||||||
`BooleanType`
|
|
||||||
: the type to store booleans. As it is stored directly inside a `basic_json` value (in a union), it must be a
|
|
||||||
trivially default-constructible, trivially copyable, and trivially destructible type that is convertible to and
|
|
||||||
from `#!cpp bool`. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#booleantype).
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### Default type
|
#### Default type
|
||||||
|
|||||||
@@ -25,15 +25,10 @@ and `ensure_ascii` parameters.
|
|||||||
result consists of ASCII characters only.
|
result consists of ASCII characters only.
|
||||||
|
|
||||||
`error_handler` (in)
|
`error_handler` (in)
|
||||||
: how to react on decoding errors; there are four possible values (see [`error_handler_t`](error_handler_t.md)):
|
: how to react on decoding errors; there are three possible values (see [`error_handler_t`](error_handler_t.md):
|
||||||
|
`strict` (throws an exception in case a decoding error occurs; default), `replace` (replace invalid UTF-8 sequences
|
||||||
- `strict`: throw a [`type_error`](../../home/exceptions.md#type-errors) exception in case a decoding error occurs
|
with U+FFFD), and `ignore` (ignore invalid UTF-8 sequences during serialization; all valid bytes are copied to the
|
||||||
(default),
|
output unchanged, and invalid bytes are dropped)).
|
||||||
- `replace`: replace invalid UTF-8 sequences with U+FFFD (� REPLACEMENT CHARACTER),
|
|
||||||
- `ignore`: ignore invalid UTF-8 sequences during serialization; all valid bytes are copied to the output unchanged,
|
|
||||||
and invalid bytes are dropped, and
|
|
||||||
- `keep`: keep invalid UTF-8 sequences during serialization; all bytes are copied to the output unchanged, so the
|
|
||||||
result is not valid UTF-8.
|
|
||||||
|
|
||||||
## Return value
|
## Return value
|
||||||
|
|
||||||
@@ -99,4 +94,3 @@ Binary values are serialized as an object containing two keys:
|
|||||||
- Indentation character `indent_char`, option `ensure_ascii` and exceptions added in version 3.0.0.
|
- Indentation character `indent_char`, option `ensure_ascii` and exceptions added in version 3.0.0.
|
||||||
- Error handlers added in version 3.4.0.
|
- Error handlers added in version 3.4.0.
|
||||||
- Serialization of binary values added in version 3.8.0.
|
- Serialization of binary values added in version 3.8.0.
|
||||||
- Error handler value `keep` added in version 3.13.0.
|
|
||||||
|
|||||||
@@ -4,13 +4,12 @@
|
|||||||
enum class error_handler_t {
|
enum class error_handler_t {
|
||||||
strict,
|
strict,
|
||||||
replace,
|
replace,
|
||||||
ignore,
|
ignore
|
||||||
keep
|
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
This enumeration is used in the [`dump`](dump.md) function to choose how to treat decoding errors while serializing a
|
This enumeration is used in the [`dump`](dump.md) function to choose how to treat decoding errors while serializing a
|
||||||
`basic_json` value. Four values are differentiated:
|
`basic_json` value. Three values are differentiated:
|
||||||
|
|
||||||
strict
|
strict
|
||||||
: throw a `type_error` exception in case of invalid UTF-8
|
: throw a `type_error` exception in case of invalid UTF-8
|
||||||
@@ -21,12 +20,6 @@ replace
|
|||||||
ignore
|
ignore
|
||||||
: ignore invalid UTF-8 sequences; all valid bytes are copied to the output unchanged, and invalid bytes are dropped
|
: ignore invalid UTF-8 sequences; all valid bytes are copied to the output unchanged, and invalid bytes are dropped
|
||||||
|
|
||||||
keep
|
|
||||||
: keep invalid UTF-8 sequences; all bytes are copied to the output unchanged. Valid characters are still escaped as
|
|
||||||
usual (e.g., `"`, `\\`, and control characters), so the result has valid JSON syntax, but it is not valid UTF-8.
|
|
||||||
In particular, [`parse`](parse.md) rejects it, and with `ensure_ascii` set to `true`, the invalid bytes are the
|
|
||||||
only non-ASCII bytes of the output.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
@@ -47,4 +40,3 @@ keep
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.4.0.
|
- Added in version 3.4.0.
|
||||||
- Added value `keep` in version 3.13.0.
|
|
||||||
|
|||||||
@@ -21,10 +21,6 @@ This overload is chosen if:
|
|||||||
- `ValueType` is not `basic_json`,
|
- `ValueType` is not `basic_json`,
|
||||||
- `json_serializer<ValueType>` has a `from_json()` method of the form `void from_json(const basic_json&, ValueType&)`
|
- `json_serializer<ValueType>` has a `from_json()` method of the form `void from_json(const basic_json&, ValueType&)`
|
||||||
|
|
||||||
`v` must not be `const`. Passing a `const` object is a compile-time error. For types such as arithmetic types, enums,
|
|
||||||
and C arrays, the error is a `static_assert` that names the problem. For other types, the overload is not viable, and
|
|
||||||
the compiler reports that no matching `get_to` was found.
|
|
||||||
|
|
||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
`ValueType`
|
`ValueType`
|
||||||
@@ -71,4 +67,3 @@ Depends on the `json_serializer<ValueType>::from_json()` implementation.
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Since version 3.3.0.
|
- Since version 3.3.0.
|
||||||
- Added a `static_assert` with a clear message for `const` arguments in version 3.13.0.
|
|
||||||
|
|||||||
@@ -35,10 +35,6 @@ class basic_json;
|
|||||||
| `BinaryType` | type for binary arrays | [`binary_t`](binary_t.md) |
|
| `BinaryType` | type for binary arrays | [`binary_t`](binary_t.md) |
|
||||||
| `CustomBaseClass` | extension point for user code | [`json_base_class_t`](json_base_class_t.md) |
|
| `CustomBaseClass` | extension point for user code | [`json_base_class_t`](json_base_class_t.md) |
|
||||||
|
|
||||||
The library imposes a number of requirements on these types that are not expressed as C++ concepts, such as the
|
|
||||||
container operations `object_t` and `array_t` must provide, or the fact that `StringType` must be `char`-based. They
|
|
||||||
are collected in [Template Parameter Requirements](../../features/types/template_parameters.md).
|
|
||||||
|
|
||||||
## Specializations
|
## Specializations
|
||||||
|
|
||||||
- [**json**](../json.md) - default specialization
|
- [**json**](../json.md) - default specialization
|
||||||
|
|||||||
@@ -88,8 +88,6 @@ Strong exception safety: if an exception occurs, the original value stays intact
|
|||||||
do not belong to the same JSON value; example: `"iterators do not fit"`
|
do not belong to the same JSON value; example: `"iterators do not fit"`
|
||||||
- Throws [`invalid_iterator.211`](../../home/exceptions.md#jsonexceptioninvalid_iterator211) if `first` or `last`
|
- Throws [`invalid_iterator.211`](../../home/exceptions.md#jsonexceptioninvalid_iterator211) if `first` or `last`
|
||||||
are iterators into container for which insert is called; example: `"passed iterators may not belong to container"`
|
are iterators into container for which insert is called; example: `"passed iterators may not belong to container"`
|
||||||
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if `first` or `last`
|
|
||||||
do not point to an array; example: `"iterators first and last must point to arrays"`
|
|
||||||
4. The function can throw the following exceptions:
|
4. The function can throw the following exceptions:
|
||||||
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
||||||
arrays; example: `"cannot use insert() with string"`
|
arrays; example: `"cannot use insert() with string"`
|
||||||
|
|||||||
@@ -21,11 +21,8 @@ The default value for `CustomBaseClass` is `void`. In this case, an
|
|||||||
|
|
||||||
#### Limitations
|
#### Limitations
|
||||||
|
|
||||||
The type `CustomBaseClass` has to be a default-constructible, non-`final` class.
|
The type `CustomBaseClass` has to be a default-constructible class.
|
||||||
`basic_json` only supports copy/move construction/assignment if `CustomBaseClass` does so as well.
|
`basic_json` only supports copy/move construction/assignment if `CustomBaseClass` does so as well.
|
||||||
A `CustomBaseClass` with non-static data members forfeits `basic_json`'s
|
|
||||||
[standard layout](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType) guarantee. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#custombaseclass).
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,6 @@ using json_serializer = JSONSerializer<T, SFINAE>;
|
|||||||
|
|
||||||
The default values for `json_serializer` is [`adl_serializer`](../adl_serializer/index.md).
|
The default values for `json_serializer` is [`adl_serializer`](../adl_serializer/index.md).
|
||||||
|
|
||||||
#### Requirements
|
|
||||||
|
|
||||||
A custom serializer must provide `#!cpp static void to_json(basic_json&, T)` for every type it serializes, and either
|
|
||||||
`#!cpp static void from_json(const basic_json&, T&)` or `#!cpp static T from_json(const basic_json&)` for every type it
|
|
||||||
deserializes. See [Template Parameter Requirements](../../features/types/template_parameters.md#jsonserializer).
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
|
|||||||
@@ -20,16 +20,6 @@ used.
|
|||||||
To store floating-point numbers in C++, a type is defined by the template parameter `NumberFloatType` which chooses the
|
To store floating-point numbers in C++, a type is defined by the template parameter `NumberFloatType` which chooses the
|
||||||
type to use.
|
type to use.
|
||||||
|
|
||||||
## Template parameters
|
|
||||||
|
|
||||||
`NumberFloatType`
|
|
||||||
: the type to store floating-point numbers. Parsing and serialization are implemented in terms of
|
|
||||||
`#!cpp std::strtof`/`#!cpp std::strtod`/`#!cpp std::strtold` and `#!cpp std::snprintf`, so the type must be
|
|
||||||
`#!cpp float`, `#!cpp double`, or `#!cpp long double`. The
|
|
||||||
[binary formats](../../features/binary_formats/index.md) additionally require `#!cpp float` or `#!cpp double`,
|
|
||||||
because they have no encoding for `#!cpp long double`. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#numberfloattype).
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### Default type
|
#### Default type
|
||||||
|
|||||||
@@ -20,13 +20,6 @@ used.
|
|||||||
To store integer numbers in C++, a type is defined by the template parameter `NumberIntegerType` which chooses the type
|
To store integer numbers in C++, a type is defined by the template parameter `NumberIntegerType` which chooses the type
|
||||||
to use.
|
to use.
|
||||||
|
|
||||||
## Template parameters
|
|
||||||
|
|
||||||
`NumberIntegerType`
|
|
||||||
: the type to store signed integers. It must be a **signed integral** type (`#!cpp std::is_integral`) with a
|
|
||||||
`#!cpp std::numeric_limits` specialization, and it is stored directly inside a `basic_json` value. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#numberintegertype-and-numberunsignedtype).
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### Default type
|
#### Default type
|
||||||
|
|||||||
@@ -20,14 +20,6 @@ used.
|
|||||||
To store unsigned integer numbers in C++, a type is defined by the template parameter `NumberUnsignedType` which chooses
|
To store unsigned integer numbers in C++, a type is defined by the template parameter `NumberUnsignedType` which chooses
|
||||||
the type to use.
|
the type to use.
|
||||||
|
|
||||||
## Template parameters
|
|
||||||
|
|
||||||
`NumberUnsignedType`
|
|
||||||
: the type to store unsigned integers. It must be an **unsigned integral** type (`#!cpp std::is_integral`) with a
|
|
||||||
`#!cpp std::numeric_limits` specialization, and it must be able to represent the absolute value of every
|
|
||||||
[`number_integer_t`](number_integer_t.md) value. See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#numberintegertype-and-numberunsignedtype).
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### Default type
|
#### Default type
|
||||||
|
|||||||
@@ -30,5 +30,3 @@ and [`default_object_comparator_t`](default_object_comparator_t.md) otherwise.
|
|||||||
- Added in version 3.0.0.
|
- Added in version 3.0.0.
|
||||||
- Changed to be conditionally defined as `#!cpp typename object_t::key_compare` or `default_object_comparator_t` in
|
- Changed to be conditionally defined as `#!cpp typename object_t::key_compare` or `default_object_comparator_t` in
|
||||||
version 3.11.0.
|
version 3.11.0.
|
||||||
- Fixed the fallback to `default_object_comparator_t`, which previously failed to compile for object types without a
|
|
||||||
`key_compare` member type, in version 3.13.0.
|
|
||||||
|
|||||||
@@ -18,11 +18,7 @@ To store objects in C++, a type is defined by the template parameters described
|
|||||||
## Template parameters
|
## Template parameters
|
||||||
|
|
||||||
`ObjectType`
|
`ObjectType`
|
||||||
: the container to store objects. Its template parameters must have the same order and meaning as those of
|
: the container to store objects (e.g., `std::map` or `std::unordered_map`)
|
||||||
`std::map`; in particular, the third parameter is a comparator. `#!cpp std::unordered_map`, whose third parameter
|
|
||||||
is a hash function, therefore needs an adapter -- see
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#objecttype) for the full list of
|
|
||||||
requirements, an adapter example, and the containers that are known to work.
|
|
||||||
|
|
||||||
`StringType`
|
`StringType`
|
||||||
: the type of the keys or names (e.g., `std::string`). The comparison function `std::less<StringType>` is used to
|
: the type of the keys or names (e.g., `std::string`). The comparison function `std::less<StringType>` is used to
|
||||||
@@ -126,4 +122,3 @@ the object is silently converted as an array of key-value pairs, which is incorr
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 1.0.0.
|
- Added in version 1.0.0.
|
||||||
- Allowed object types whose `erase(iterator)` returns `#!cpp void` in version 3.13.0.
|
|
||||||
|
|||||||
@@ -103,10 +103,6 @@ A UTF-8 byte order mark is silently ignored.
|
|||||||
Invalid Unicode escapes and unpaired surrogates in the input are reported as
|
Invalid Unicode escapes and unpaired surrogates in the input are reported as
|
||||||
[`parse_error.101`](../../home/exceptions.md#jsonexceptionparse_error101) with a detailed message.
|
[`parse_error.101`](../../home/exceptions.md#jsonexceptionparse_error101) with a detailed message.
|
||||||
|
|
||||||
By default, a `'\0'` (NUL) byte anywhere in the input is treated as end of input, rather than as an ordinary (and,
|
|
||||||
outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-bytes-in-the-input) for details and the
|
|
||||||
[`JSON_STRICT_NUL_HANDLING`](../macros/json_strict_nul_handling.md) macro to opt into rejecting it instead.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
??? example "Parsing from a character array"
|
??? example "Parsing from a character array"
|
||||||
@@ -240,8 +236,6 @@ outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-by
|
|||||||
- [accept](accept.md) - check if the input is valid JSON
|
- [accept](accept.md) - check if the input is valid JSON
|
||||||
- [sax_parse](sax_parse.md) - parse input using the SAX interface
|
- [sax_parse](sax_parse.md) - parse input using the SAX interface
|
||||||
- [operator>>](../operator_gtgt.md) - deserialize from stream
|
- [operator>>](../operator_gtgt.md) - deserialize from stream
|
||||||
- [`JSON_STRICT_NUL_HANDLING`](../macros/json_strict_nul_handling.md) - opt in to rejecting a NUL byte in the input
|
|
||||||
instead of treating it as end of input
|
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
@@ -252,8 +246,6 @@ outside of a string, invalid) byte; see the [FAQ entry](../../home/faq.md#nul-by
|
|||||||
- Added `ignore_trailing_commas` in version 3.13.0.
|
- Added `ignore_trailing_commas` in version 3.13.0.
|
||||||
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
||||||
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
||||||
- `JSON_STRICT_NUL_HANDLING` added in version 3.13.0 to optionally reject a NUL byte in the input instead of treating
|
|
||||||
it as end of input; planned to become the default in version 4.0.0.
|
|
||||||
|
|
||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
("add", "remove", "move")
|
("add", "remove", "move")
|
||||||
- Throws [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) if an "add" operation's target
|
- Throws [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) if an "add" operation's target
|
||||||
location has a parent that is neither an object nor an array.
|
location has a parent that is neither an object nor an array.
|
||||||
- Throws [`out_of_range.413`](../../home/exceptions.md#jsonexceptionout_of_range413) if a "remove" operation's target
|
|
||||||
location has a parent that is neither an object nor an array.
|
|
||||||
- Throws [`out_of_range.414`](../../home/exceptions.md#jsonexceptionout_of_range414) if a "move" operation's "from"
|
|
||||||
location is a proper prefix of its "path" location.
|
|
||||||
- Throws [`other_error.501`](../../home/exceptions.md#jsonexceptionother_error501) if "test" operation was
|
- Throws [`other_error.501`](../../home/exceptions.md#jsonexceptionother_error501) if "test" operation was
|
||||||
unsuccessful.
|
unsuccessful.
|
||||||
|
|
||||||
@@ -79,7 +75,3 @@ is thrown. In any case, the original value is not changed: the patch is applied
|
|||||||
- Added in version 2.0.0.
|
- Added in version 2.0.0.
|
||||||
- Added [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) and stopped relying on an internal assertion when an "add" operation's
|
- Added [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) and stopped relying on an internal assertion when an "add" operation's
|
||||||
target location has a non-object/non-array parent in version 3.13.0.
|
target location has a non-object/non-array parent in version 3.13.0.
|
||||||
- Added [`out_of_range.413`](../../home/exceptions.md#jsonexceptionout_of_range413) and stopped silently ignoring a "remove" operation whose target
|
|
||||||
location has a non-object/non-array parent in version 3.13.0.
|
|
||||||
- Added [`out_of_range.414`](../../home/exceptions.md#jsonexceptionout_of_range414) and rejected a "move" operation whose "from" location is a proper
|
|
||||||
prefix of its "path" location instead of silently producing a corrupted result in version 3.13.0.
|
|
||||||
|
|||||||
@@ -30,10 +30,6 @@ No guarantees, value may be corrupted by an unsuccessful patch operation.
|
|||||||
("add", "remove", "move")
|
("add", "remove", "move")
|
||||||
- Throws [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) if an "add" operation's target
|
- Throws [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) if an "add" operation's target
|
||||||
location has a parent that is neither an object nor an array.
|
location has a parent that is neither an object nor an array.
|
||||||
- Throws [`out_of_range.413`](../../home/exceptions.md#jsonexceptionout_of_range413) if a "remove" operation's target
|
|
||||||
location has a parent that is neither an object nor an array.
|
|
||||||
- Throws [`out_of_range.414`](../../home/exceptions.md#jsonexceptionout_of_range414) if a "move" operation's "from"
|
|
||||||
location is a proper prefix of its "path" location.
|
|
||||||
- Throws [`other_error.501`](../../home/exceptions.md#jsonexceptionother_error501) if "test" operation was
|
- Throws [`other_error.501`](../../home/exceptions.md#jsonexceptionother_error501) if "test" operation was
|
||||||
unsuccessful.
|
unsuccessful.
|
||||||
|
|
||||||
@@ -76,7 +72,3 @@ function throws an exception.
|
|||||||
- Added in version 3.11.0.
|
- Added in version 3.11.0.
|
||||||
- Added [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) and stopped relying on an internal assertion when an "add" operation's
|
- Added [`out_of_range.411`](../../home/exceptions.md#jsonexceptionout_of_range411) and stopped relying on an internal assertion when an "add" operation's
|
||||||
target location has a non-object/non-array parent in version 3.13.0.
|
target location has a non-object/non-array parent in version 3.13.0.
|
||||||
- Added [`out_of_range.413`](../../home/exceptions.md#jsonexceptionout_of_range413) and stopped silently ignoring a "remove" operation whose target
|
|
||||||
location has a non-object/non-array parent in version 3.13.0.
|
|
||||||
- Added [`out_of_range.414`](../../home/exceptions.md#jsonexceptionout_of_range414) and rejected a "move" operation whose "from" location is a proper
|
|
||||||
prefix of its "path" location instead of silently producing a corrupted result in version 3.13.0.
|
|
||||||
|
|||||||
@@ -70,8 +70,7 @@ The SAX event lister must follow the interface of [`json_sax`](../json_sax/index
|
|||||||
|
|
||||||
`strict` (in)
|
`strict` (in)
|
||||||
: whether the input has to be consumed completely (optional, `#!cpp true` by default); when `#!cpp false` and the
|
: whether the input has to be consumed completely (optional, `#!cpp true` by default); when `#!cpp false` and the
|
||||||
input is a `#!cpp std::istream`, the character that terminates a number is consumed unless
|
input is a `#!cpp std::istream`, the stream is left positioned right after the parsed value
|
||||||
[`JSON_PRECISE_STREAM_POSITION`](../macros/json_precise_stream_position.md) is defined to `1`; see [`operator>>`](../operator_gtgt.md#notes)
|
|
||||||
|
|
||||||
`ignore_comments` (in)
|
`ignore_comments` (in)
|
||||||
: whether comments should be ignored and treated like whitespace (`#!cpp true`) or yield a parse error
|
: whether comments should be ignored and treated like whitespace (`#!cpp true`) or yield a parse error
|
||||||
@@ -138,8 +137,8 @@ A UTF-8 byte order mark is silently ignored.
|
|||||||
- Added `ignore_trailing_commas` in version 3.13.0.
|
- Added `ignore_trailing_commas` in version 3.13.0.
|
||||||
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
- Extended container support (1) to include types with lvalue-only ADL `begin`/`end` (matching `std::begin`/`std::end` semantics) in version 3.13.0.
|
||||||
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
- Extended overload (2) to accept heterogeneous iterator+sentinel pairs (C++20 ranges support) in version 3.13.0.
|
||||||
- `JSON_PRECISE_STREAM_POSITION` added in version 3.13.0 to optionally leave a `#!cpp std::istream` positioned right
|
- Changed in version 4.0.0 to leave a `#!cpp std::istream` positioned right after the parsed value when `strict` is
|
||||||
after the parsed value when `strict` is `#!cpp false`.
|
`#!cpp false`; see [`operator>>`](../operator_gtgt.md#notes).
|
||||||
|
|
||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
|
|||||||
@@ -23,11 +23,6 @@ JSON class into byte-sized characters during deserialization.
|
|||||||
`StringType`. To work with wide-character data, convert it to/from UTF-8 at the boundary instead -- see the
|
`StringType`. To work with wide-character data, convert it to/from UTF-8 at the boundary instead -- see the
|
||||||
FAQ's [wide string handling](../../home/faq.md#wide-string-handling) section for a conversion recipe.
|
FAQ's [wide string handling](../../home/faq.md#wide-string-handling) section for a conversion recipe.
|
||||||
|
|
||||||
Beyond the character type, the library expects a substantial part of the `#!cpp std::string` interface (contiguous
|
|
||||||
null-terminated `data()`, `substr()`, `find()`, `append()`, ...). See
|
|
||||||
[Template Parameter Requirements](../../features/types/template_parameters.md#stringtype) for the full list and
|
|
||||||
for the string types that are known to work.
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
#### Default type
|
#### Default type
|
||||||
@@ -83,5 +78,3 @@ and an example.
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 1.0.0.
|
- Added in version 1.0.0.
|
||||||
- Removed the requirement that `string_t` be implicitly convertible from `#!cpp std::string`, which the BSON writer and
|
|
||||||
the UBJSON reader relied on, in version 3.13.0.
|
|
||||||
|
|||||||
@@ -34,14 +34,10 @@ void swap(typename binary_t::container_type& other);
|
|||||||
```
|
```
|
||||||
|
|
||||||
1. Exchanges the contents of the JSON value with those of `other`. Does not invoke any move, copy, or swap operations on
|
1. Exchanges the contents of the JSON value with those of `other`. Does not invoke any move, copy, or swap operations on
|
||||||
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. If macro
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
||||||
[`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) is defined to `#!cpp 1`, the
|
|
||||||
[`start_pos()`](start_pos.md)/[`end_pos()`](end_pos.md) diagnostic positions are exchanged along with the value.
|
|
||||||
2. Exchanges the contents of the JSON value from `left` with those of `right`. Does not invoke any move, copy, or swap
|
2. Exchanges the contents of the JSON value from `left` with those of `right`. Does not invoke any move, copy, or swap
|
||||||
operations on individual elements. All iterators and references remain valid. The past-the-end iterator is
|
operations on individual elements. All iterators and references remain valid. The past-the-end iterator is
|
||||||
invalidated. Implemented as a friend function callable via ADL. If macro
|
invalidated. Implemented as a friend function callable via ADL.
|
||||||
[`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) is defined to `#!cpp 1`, the
|
|
||||||
[`start_pos()`](start_pos.md)/[`end_pos()`](end_pos.md) diagnostic positions are exchanged along with the value.
|
|
||||||
3. Exchanges the contents of a JSON array with those of `other`. Does not invoke any move, copy, or swap operations on
|
3. Exchanges the contents of a JSON array with those of `other`. Does not invoke any move, copy, or swap operations on
|
||||||
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
||||||
4. Exchanges the contents of a JSON object with those of `other`. Does not invoke any move, copy, or swap operations on
|
4. Exchanges the contents of a JSON object with those of `other`. Does not invoke any move, copy, or swap operations on
|
||||||
|
|||||||
@@ -52,11 +52,6 @@ optional, `#!cpp bjdata_version_t::draft2` by default.
|
|||||||
|
|
||||||
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
|
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
|
||||||
|
|
||||||
## Exceptions
|
|
||||||
|
|
||||||
- Throws [`other_error.502`](../../home/exceptions.md#jsonexceptionother_error502) if `use_type` is true and `use_size`
|
|
||||||
is false.
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
Linear in the size of the JSON value `j`.
|
Linear in the size of the JSON value `j`.
|
||||||
|
|||||||
@@ -46,8 +46,7 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
Linear in the size of the JSON value `j`. The length prefixes of all nested documents and arrays are computed in one
|
Linear in the size of the JSON value `j`.
|
||||||
pass before anything is written.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
@@ -76,4 +75,3 @@ pass before anything is written.
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.4.0.
|
- Added in version 3.4.0.
|
||||||
- Linear in the size of `j`, and no longer limited by the call stack for deeply nested values, since version 3.13.0.
|
|
||||||
|
|||||||
@@ -45,11 +45,6 @@ The exact mapping and its limitations are described on a [dedicated page](../../
|
|||||||
|
|
||||||
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
|
Strong guarantee: if an exception is thrown, there are no changes in the JSON value.
|
||||||
|
|
||||||
## Exceptions
|
|
||||||
|
|
||||||
- Throws [`other_error.502`](../../home/exceptions.md#jsonexceptionother_error502) if `use_type` is true and `use_size`
|
|
||||||
is false.
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
Linear in the size of the JSON value `j`.
|
Linear in the size of the JSON value `j`.
|
||||||
|
|||||||
@@ -37,14 +37,7 @@ Linear in the size of the JSON value.
|
|||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
Empty objects and arrays are flattened by [`flatten()`](flatten.md) to `#!json null` values and cannot unflattened to
|
Empty objects and arrays are flattened by [`flatten()`](flatten.md) to `#!json null` values and cannot unflattened to
|
||||||
their original type.
|
their original type. Apart from this example, for a JSON value `j`, the following is always true:
|
||||||
|
|
||||||
A flattened array and a flattened object whose keys are array indices are indistinguishable, because both are
|
|
||||||
described by the same JSON pointers. A value is therefore restored as an array if and only if one of its keys is the
|
|
||||||
reference token `0`, and as an object otherwise: `#!json {"2": 1}` is restored unchanged, whereas `#!json {"0": 1}` is
|
|
||||||
restored as `#!json [1]`. This decision does not depend on the order in which the flattened object is iterated.
|
|
||||||
|
|
||||||
Apart from these two cases, for a JSON value `j`, the following is always true:
|
|
||||||
`#!cpp j == j.flatten().unflatten()`.
|
`#!cpp j == j.flatten().unflatten()`.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
@@ -70,4 +63,3 @@ Apart from these two cases, for a JSON value `j`, the following is always true:
|
|||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 2.0.0.
|
- Added in version 2.0.0.
|
||||||
- Made the array/object decision independent of the object's iteration order in version 3.13.0.
|
|
||||||
|
|||||||
@@ -14,13 +14,6 @@ header. See also the [macro overview page](../../features/macros.md).
|
|||||||
- [**JSON_DIAGNOSTIC_POSITIONS**](json_diagnostic_positions.md) - access positions of elements
|
- [**JSON_DIAGNOSTIC_POSITIONS**](json_diagnostic_positions.md) - access positions of elements
|
||||||
- [**JSON_NOEXCEPTION**](json_noexception.md) - switch off exceptions
|
- [**JSON_NOEXCEPTION**](json_noexception.md) - switch off exceptions
|
||||||
|
|
||||||
## Parsing
|
|
||||||
|
|
||||||
- [**JSON_PRECISE_STREAM_POSITION**](json_precise_stream_position.md) - opt in to leaving an input stream positioned
|
|
||||||
right after a parsed number
|
|
||||||
- [**JSON_STRICT_NUL_HANDLING**](json_strict_nul_handling.md) - opt in to rejecting a NUL byte in the input instead of
|
|
||||||
treating it as end of input
|
|
||||||
|
|
||||||
## Language support
|
## Language support
|
||||||
|
|
||||||
- [**JSON_HAS_CPP_11**<br>**JSON_HAS_CPP_14**<br>**JSON_HAS_CPP_17**<br>**JSON_HAS_CPP_20**](json_has_cpp_11.md) - set supported C++ standard
|
- [**JSON_HAS_CPP_11**<br>**JSON_HAS_CPP_14**<br>**JSON_HAS_CPP_17**<br>**JSON_HAS_CPP_20**](json_has_cpp_11.md) - set supported C++ standard
|
||||||
@@ -29,10 +22,8 @@ header. See also the [macro overview page](../../features/macros.md).
|
|||||||
- [**JSON_HAS_STD_FORMAT**](json_has_std_format.md) - control `std::format`/`std::formatter` support
|
- [**JSON_HAS_STD_FORMAT**](json_has_std_format.md) - control `std::format`/`std::formatter` support
|
||||||
- [**JSON_HAS_THREE_WAY_COMPARISON**](json_has_three_way_comparison.md) - control 3-way comparison support
|
- [**JSON_HAS_THREE_WAY_COMPARISON**](json_has_three_way_comparison.md) - control 3-way comparison support
|
||||||
- [**JSON_NO_IO**](json_no_io.md) - switch off functions relying on certain C++ I/O headers
|
- [**JSON_NO_IO**](json_no_io.md) - switch off functions relying on certain C++ I/O headers
|
||||||
- [**JSON_NO_THREAD_LOCAL**](json_no_thread_local.md) - switch off the use of `thread_local` storage
|
|
||||||
- [**JSON_SKIP_UNSUPPORTED_COMPILER_CHECK**](json_skip_unsupported_compiler_check.md) - do not warn about unsupported compilers
|
- [**JSON_SKIP_UNSUPPORTED_COMPILER_CHECK**](json_skip_unsupported_compiler_check.md) - do not warn about unsupported compilers
|
||||||
- [**JSON_USE_GLOBAL_UDLS**](json_use_global_udls.md) - place user-defined string literals (UDLs) into the global namespace
|
- [**JSON_USE_GLOBAL_UDLS**](json_use_global_udls.md) - place user-defined string literals (UDLs) into the global namespace
|
||||||
- [**JSON_USE_SIMDUTF**](json_use_simdutf.md) - use the simdutf library to accelerate UTF-8 validation
|
|
||||||
|
|
||||||
## Library version
|
## Library version
|
||||||
|
|
||||||
|
|||||||
@@ -38,28 +38,6 @@ The default value is `0` (disabled — existing behavior is preserved).
|
|||||||
|
|
||||||
This macro must be defined **before** including `<nlohmann/json.hpp>`. Defining it after the include has no effect.
|
This macro must be defined **before** including `<nlohmann/json.hpp>`. Defining it after the include has no effect.
|
||||||
|
|
||||||
!!! warning "Applies to every single-element list"
|
|
||||||
|
|
||||||
The macro does not only affect a single JSON value in braces. **Any** single-element braced list is treated as its
|
|
||||||
element, so it no longer creates a one-element array:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
json j1 = {1}; // 1, not [1]
|
|
||||||
json j2 = {"text"}; // "text", not ["text"]
|
|
||||||
json j3 = {{1, 2}}; // [1,2], not [[1,2]]
|
|
||||||
```
|
|
||||||
|
|
||||||
Code that relies on these producing arrays must use `json::array()` instead (see below). Lists with more than one
|
|
||||||
element, and a single `[string, value]` pair such as `{{"key", "value"}}`, which still creates an object, are not
|
|
||||||
affected. The library's own conversions are not affected either: for example, `std::tuple<int>{5}` still becomes
|
|
||||||
`[5]`.
|
|
||||||
|
|
||||||
!!! note "ABI compatibility"
|
|
||||||
|
|
||||||
The value of this macro is encoded in the [namespace](../../features/namespace.md) (tag `_bics`), resulting in
|
|
||||||
distinct symbol names. Translation units compiled with and without it can therefore be linked into the same program
|
|
||||||
without One Definition Rule (ODR) violations, but they cannot exchange instances of library types.
|
|
||||||
|
|
||||||
!!! tip "Workaround without the macro"
|
!!! tip "Workaround without the macro"
|
||||||
|
|
||||||
To explicitly create a single-element array without enabling this macro, use `json::array()`:
|
To explicitly create a single-element array without enabling this macro, use `json::array()`:
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
# JSON_NO_THREAD_LOCAL
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_NO_THREAD_LOCAL
|
|
||||||
```
|
|
||||||
|
|
||||||
When defined, the library does not use `#!cpp thread_local` storage. This is relevant for the few environments whose
|
|
||||||
toolchain does not support it.
|
|
||||||
|
|
||||||
Copying a value and comparing two values both descend into the first levels by letting the containers copy or compare
|
|
||||||
themselves, and finish whatever is nested deeper than that without the call stack, so that neither can exhaust the stack
|
|
||||||
however deeply the values are nested. Each counts the levels it has descended into in a `#!cpp thread_local` variable, as
|
|
||||||
a counter shared between threads would be raced.
|
|
||||||
|
|
||||||
Without those counters, no descent can be bounded safely, so objects and arrays are copied and compared without the call
|
|
||||||
stack right away. Both keep working exactly as they do otherwise - the same values come out, the same comparisons hold,
|
|
||||||
and deeply nested values are handled just as safely - but both are slower, because the containers no longer copy or
|
|
||||||
compare themselves. Copying the benchmark documents takes 9% (`canada.json`) to 34% (`twitter.json`) longer, and
|
|
||||||
comparing two equal ones 10% (`citm_catalog.json`) to 90% (`canada.json`) longer.
|
|
||||||
|
|
||||||
## Default definition
|
|
||||||
|
|
||||||
By default, `#!cpp JSON_NO_THREAD_LOCAL` is not defined.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#undef JSON_NO_THREAD_LOCAL
|
|
||||||
```
|
|
||||||
|
|
||||||
The library defines it by itself for Clang targeting MinGW, which does not survive the `#!cpp thread_local` storage:
|
|
||||||
copying a value segfaults there, with both old and current Clang versions, while GCC targeting MinGW is unaffected.
|
|
||||||
Copying and comparing fall back to working without the call stack there, as they do whenever the macro is defined.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
??? example
|
|
||||||
|
|
||||||
The code below forces the library not to use `#!cpp thread_local` storage.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_NO_THREAD_LOCAL 1
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
## Version history
|
|
||||||
|
|
||||||
- Added in version 3.12.1.
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
# JSON_PRECISE_STREAM_POSITION
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_PRECISE_STREAM_POSITION /* value */
|
|
||||||
```
|
|
||||||
|
|
||||||
When defined to `1`, [`operator>>`](../operator_gtgt.md) and [`sax_parse`](../basic_json/sax_parse.md) with
|
|
||||||
`strict = false` leave a `#!cpp std::istream` positioned right after the parsed value for every value type. By default,
|
|
||||||
the character that terminates a number is consumed as well.
|
|
||||||
|
|
||||||
The macro only affects reading from a `#!cpp std::istream` when the rest of the stream is not required to be consumed.
|
|
||||||
[`parse`](../basic_json/parse.md), [`accept`](../basic_json/accept.md), and all other inputs (strings, iterators,
|
|
||||||
containers, `#!cpp FILE*`) are never affected.
|
|
||||||
|
|
||||||
## Default definition
|
|
||||||
|
|
||||||
The default value is `0` (disabled — existing behavior is preserved).
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_PRECISE_STREAM_POSITION 0
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
!!! note "Background"
|
|
||||||
|
|
||||||
A number is the only JSON value whose end can be detected solely by reading the character that follows it. By
|
|
||||||
default, that character is consumed and not put back, so the stream is left one byte too far after a number, and
|
|
||||||
only after a number:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
std::istringstream input("1true");
|
|
||||||
json j;
|
|
||||||
input >> j; // j == 1, but the stream now starts at "rue"
|
|
||||||
```
|
|
||||||
|
|
||||||
With this macro, the character is only looked at and left in the stream, so the stream starts at `true`. This
|
|
||||||
does not require the stream buffer to support putting a character back.
|
|
||||||
|
|
||||||
This was not changed unconditionally, because code can depend on the consumed character, even unknowingly (see
|
|
||||||
[#5340](https://github.com/nlohmann/json/issues/5340)). Both of the following work by default only because the
|
|
||||||
character after each number is swallowed, and behave differently with this macro:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
std::istringstream input("1,2,3");
|
|
||||||
json j1, j2, j3;
|
|
||||||
input >> j1 >> j2 >> j3; // default: 1, 2, 3
|
|
||||||
// with the macro: throws parse_error.101 at the ','
|
|
||||||
```
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
std::istringstream input("42\nfoo");
|
|
||||||
json j;
|
|
||||||
std::string line;
|
|
||||||
input >> j;
|
|
||||||
std::getline(input, line); // default: "foo"
|
|
||||||
// with the macro: "" (like after reading an int with >>)
|
|
||||||
```
|
|
||||||
|
|
||||||
In both cases, the behavior with the macro is what you already get today when the value is not a number: `"a","b"`
|
|
||||||
fails at the `,`, and `std::getline` after `{}` returns an empty string. This macro offers an opt-in path to
|
|
||||||
the consistent behavior ahead of version 4.0.0, where it is planned to become the default.
|
|
||||||
|
|
||||||
!!! warning "Opt-in only"
|
|
||||||
|
|
||||||
This macro must be defined **before** including `<nlohmann/json.hpp>`. Defining it after the include has no
|
|
||||||
effect.
|
|
||||||
|
|
||||||
!!! note "ABI compatibility"
|
|
||||||
|
|
||||||
The value of this macro is encoded in the [namespace](../../features/namespace.md) (tag `_psp`), resulting in
|
|
||||||
distinct symbol names. Translation units compiled with and without it can therefore be linked into the same program
|
|
||||||
without One Definition Rule (ODR) violations, but they cannot exchange instances of library types.
|
|
||||||
|
|
||||||
!!! tip "Workaround without the macro"
|
|
||||||
|
|
||||||
Separate the values in the stream with whitespace. The character consumed after a number is then the separator,
|
|
||||||
and whitespace before the next value is skipped anyway.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
??? example "Default behavior (macro not defined)"
|
|
||||||
|
|
||||||
Without the macro, the character after a number is consumed:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::istringstream input("1true");
|
|
||||||
json j1, j2;
|
|
||||||
input >> j1; // j1 == 1
|
|
||||||
input >> j2; // throws parse_error.101: the stream now starts at "rue"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
??? example "Opt-in precise stream position (macro defined to 1)"
|
|
||||||
|
|
||||||
With the macro, the stream is positioned right after the number:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_PRECISE_STREAM_POSITION 1
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::istringstream input("1true");
|
|
||||||
json j1, j2;
|
|
||||||
input >> j1; // j1 == 1
|
|
||||||
input >> j2; // j2 == true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## See also
|
|
||||||
|
|
||||||
- [**operator>>**](../operator_gtgt.md) - deserialize from stream
|
|
||||||
- [**sax_parse**](../basic_json/sax_parse.md) - generate SAX events
|
|
||||||
|
|
||||||
## Version history
|
|
||||||
|
|
||||||
- Added in version 3.13.0.
|
|
||||||
- Planned to become the default (with the macro removed) in version 4.0.0.
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
# JSON_STRICT_NUL_HANDLING
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_STRICT_NUL_HANDLING /* value */
|
|
||||||
```
|
|
||||||
|
|
||||||
When defined to `1`, a `'\0'` (NUL) byte in JSON text input is rejected with `parse_error.101`, like any other
|
|
||||||
unexpected byte, instead of being silently treated as end of input.
|
|
||||||
|
|
||||||
The macro only affects the JSON text parser ([`parse`](../basic_json/parse.md), [`accept`](../basic_json/accept.md),
|
|
||||||
[`sax_parse`](../basic_json/sax_parse.md), and [`operator>>`](../operator_gtgt.md)). There are three cases where a NUL
|
|
||||||
byte is still not rejected:
|
|
||||||
|
|
||||||
- The binary formats ([`from_bjdata`](../basic_json/from_bjdata.md), [`from_bson`](../basic_json/from_bson.md),
|
|
||||||
[`from_cbor`](../basic_json/from_cbor.md), [`from_msgpack`](../basic_json/from_msgpack.md),
|
|
||||||
[`from_ubjson`](../basic_json/from_ubjson.md)) are never affected: there, `0x00` is ordinary data.
|
|
||||||
- A bare `const char*` pointer has no length of its own, so its length is still determined with `strlen()`. The first
|
|
||||||
NUL byte therefore still marks the end of the input, and nothing after it is read.
|
|
||||||
- One trailing `'\0'` at the end of a `char` array (e.g., a string literal) is trimmed; see the warning below.
|
|
||||||
|
|
||||||
## Default definition
|
|
||||||
|
|
||||||
The default value is `0` (disabled — existing behavior is preserved).
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_STRICT_NUL_HANDLING 0
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
!!! note "Background"
|
|
||||||
|
|
||||||
By default, a `'\0'` byte anywhere in the input is treated the same as the real end of the input, rather than as
|
|
||||||
an ordinary (and, outside of a string, invalid) byte. Everything from that byte onward is silently ignored,
|
|
||||||
without a parse error - including further, otherwise well-formed JSON:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
json::parse(std::string("123") + '\0'); // == 123, no error
|
|
||||||
json::parse(std::string("123") + '\0' + "true"); // == 123, the "true" is silently ignored too
|
|
||||||
```
|
|
||||||
|
|
||||||
This falls out of the same convention used when no explicit input length is given at all: parsing from a
|
|
||||||
`const char*` already stops at the first NUL byte via `strlen()`, since a bare pointer has no length of its own.
|
|
||||||
The library applies that same NUL-terminated-C-string convention uniformly, rather than only when a length is
|
|
||||||
genuinely unavailable - so a `std::string`, iterator range, or container whose content happens to include a NUL
|
|
||||||
byte is affected the same way a raw `const char*` would be (see the
|
|
||||||
[FAQ entry](../../home/faq.md#nul-bytes-in-the-input) for a fuller explanation).
|
|
||||||
|
|
||||||
This was not fixed unconditionally, because doing so is backwards-incompatible for any caller who happens to
|
|
||||||
depend on the current behavior - even unknowingly, for instance because their input already contains trailing
|
|
||||||
padding they never noticed was being discarded (see [#5530](https://github.com/nlohmann/json/issues/5530)).
|
|
||||||
This macro instead offers an opt-in path to the corrected behavior ahead of version 4.0.0, where it is planned to
|
|
||||||
become the default.
|
|
||||||
|
|
||||||
!!! warning "Opt-in only"
|
|
||||||
|
|
||||||
This macro must be defined **before** including `<nlohmann/json.hpp>`. Defining it after the include has no
|
|
||||||
effect.
|
|
||||||
|
|
||||||
Enabling it also changes how a `char` array (including a string literal, e.g. `json::parse("123")`) is read: such
|
|
||||||
an array normally carries a trailing `'\0'` contributed by the compiler, not by the source text. With this macro
|
|
||||||
enabled, that one trailing byte is trimmed if present so that parsing a string literal keeps working; every other
|
|
||||||
byte in the array - including any `'\0'` that is not the very last element - is read as real data and rejected
|
|
||||||
like any other unexpected byte. Arrays of any other element type (`unsigned char`, `std::uint8_t`, ...), as used
|
|
||||||
for CBOR or MessagePack, are never affected by this trimming; their full extent - including a genuine trailing
|
|
||||||
`0x00` - is always preserved, in both states of this macro.
|
|
||||||
|
|
||||||
!!! note "ABI compatibility"
|
|
||||||
|
|
||||||
The value of this macro is encoded in the [namespace](../../features/namespace.md) (tag `_snul`), resulting in
|
|
||||||
distinct symbol names. Translation units compiled with and without it can therefore be linked into the same program
|
|
||||||
without One Definition Rule (ODR) violations, but they cannot exchange instances of library types.
|
|
||||||
|
|
||||||
!!! tip "Workaround without the macro"
|
|
||||||
|
|
||||||
To reject a NUL byte without enabling this macro, trim your input yourself before calling `parse()`:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
s.resize(s.find('\0')); // drop everything from the first NUL onward, if any
|
|
||||||
json::parse(s);
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
??? example "Default behavior (macro not defined)"
|
|
||||||
|
|
||||||
Without the macro, a NUL byte silently ends parsing at that point:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
json j = json::parse(std::string("123") + '\0' + "true");
|
|
||||||
// j is 123 -- the '\0' and everything after it is silently ignored
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
??? example "Opt-in strict handling (macro defined to 1)"
|
|
||||||
|
|
||||||
With the macro, a NUL byte is rejected like any other unexpected byte:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_STRICT_NUL_HANDLING 1
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
json j = json::parse(std::string("123") + '\0' + "true");
|
|
||||||
// throws parse_error.101 -- the NUL byte is now invalid input,
|
|
||||||
// exactly like any other unexpected trailing byte
|
|
||||||
|
|
||||||
json ok = json::parse("123");
|
|
||||||
// ok is 123 -- parsing from a string literal still works
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## See also
|
|
||||||
|
|
||||||
- [FAQ: NUL bytes in the input](../../home/faq.md#nul-bytes-in-the-input)
|
|
||||||
- [**parse**](../basic_json/parse.md) - deserialize from a compatible input
|
|
||||||
- [**accept**](../basic_json/accept.md) - check if the input is valid JSON
|
|
||||||
- [**operator>>**](../operator_gtgt.md) - deserialize from stream
|
|
||||||
|
|
||||||
## Version history
|
|
||||||
|
|
||||||
- Added in version 3.13.0.
|
|
||||||
- Planned to become the default (with the macro removed) in version 4.0.0.
|
|
||||||
@@ -12,11 +12,9 @@
|
|||||||
Controls how exceptions are handled by the library.
|
Controls how exceptions are handled by the library.
|
||||||
|
|
||||||
1. This macro overrides [`#!cpp catch`](https://en.cppreference.com/w/cpp/language/try_catch) calls inside the library.
|
1. This macro overrides [`#!cpp catch`](https://en.cppreference.com/w/cpp/language/try_catch) calls inside the library.
|
||||||
The argument is the type of the exception to catch. The library uses it in a single place: to swallow any exception
|
The argument is the type of the exception to catch. As of version 3.8.0, the library only catches `std::out_of_range`
|
||||||
escaping the parent-pointer check that [`JSON_DIAGNOSTICS`](json_diagnostics.md) adds to the class invariant. The
|
exceptions internally to rethrow them as [`json::out_of_range`](../../home/exceptions.md#out-of-range) exceptions.
|
||||||
places where the library catches its own [`json::out_of_range`](../../home/exceptions.md#out-of-range) exceptions
|
The macro is always followed by a scope.
|
||||||
use `JSON_INTERNAL_CATCH` instead, which `JSON_CATCH_USER` also overrides unless `JSON_INTERNAL_CATCH_USER` is
|
|
||||||
defined. The macro is always followed by a scope.
|
|
||||||
2. This macro overrides `#!cpp throw` calls inside the library. The argument is the exception to be thrown. Note that
|
2. This macro overrides `#!cpp throw` calls inside the library. The argument is the exception to be thrown. Note that
|
||||||
`JSON_THROW_USER` should leave the current scope (e.g., by throwing or aborting), as continuing after it may yield
|
`JSON_THROW_USER` should leave the current scope (e.g., by throwing or aborting), as continuing after it may yield
|
||||||
undefined behavior.
|
undefined behavior.
|
||||||
|
|||||||
@@ -24,14 +24,6 @@ By default, implicit conversions are enabled.
|
|||||||
You can prepare existing code by already defining `JSON_USE_IMPLICIT_CONVERSIONS` to `0` and replace any implicit
|
You can prepare existing code by already defining `JSON_USE_IMPLICIT_CONVERSIONS` to `0` and replace any implicit
|
||||||
conversions with calls to [`get`](../basic_json/get.md).
|
conversions with calls to [`get`](../basic_json/get.md).
|
||||||
|
|
||||||
!!! tip "Automatic migration"
|
|
||||||
|
|
||||||
The community-maintained clang-tidy check `modernize-nlohmann-json-explicit-conversions` rewrites implicit
|
|
||||||
conversions into explicit calls to [`get`](../basic_json/get.md); for example, `#!cpp int i = j;` becomes
|
|
||||||
`#!cpp int i = j.get<int>();`. The check is not part of clang-tidy itself, and it does not catch every case (for
|
|
||||||
example, constructing a `std::optional` from a JSON value), so review the result. See
|
|
||||||
[discussion #4610](https://github.com/nlohmann/json/discussions/4610) for how to build and use it.
|
|
||||||
|
|
||||||
!!! hint "CMake option"
|
!!! hint "CMake option"
|
||||||
|
|
||||||
Implicit conversions can also be controlled with the CMake option
|
Implicit conversions can also be controlled with the CMake option
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
# JSON_USE_SIMDUTF
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_USE_SIMDUTF
|
|
||||||
```
|
|
||||||
|
|
||||||
When defined, the parser validates the UTF-8 content of JSON strings that come from a **contiguous byte input**
|
|
||||||
(`std::string`, `std::vector<char>`/`<std::uint8_t>`, string literals, `const char*` ranges, …) using the
|
|
||||||
[simdutf](https://github.com/simdutf/simdutf) library instead of the built-in scalar validator. On text with many
|
|
||||||
non-ASCII characters (e.g. CJK or emoji) this can validate several times faster.
|
|
||||||
|
|
||||||
This is an **opt-in external dependency**. The library itself remains header-only and its behavior is unchanged: the
|
|
||||||
same input is accepted or rejected either way, and every parse error is reported at the same position with the same
|
|
||||||
message (simdutf is only used to fast-path *valid* runs; anything it flags falls back to the scalar path so the exact
|
|
||||||
diagnostic is preserved). Streaming inputs (files, `std::istream`, wide strings, user-defined adapters) always use the
|
|
||||||
scalar path.
|
|
||||||
|
|
||||||
When `JSON_USE_SIMDUTF` is defined you must make the `simdutf.h` header available on the include path and link the
|
|
||||||
simdutf library. When it is not defined, no simdutf header is included and there is no dependency.
|
|
||||||
|
|
||||||
!!! note "Requires C++17"
|
|
||||||
|
|
||||||
simdutf requires C++17 and its header rejects older standards with an `#!cpp #error`. The backend is therefore only
|
|
||||||
compiled in from C++17 on. In C++11 and C++14 the macro has no effect and the scalar validator is used, which
|
|
||||||
accepts and rejects exactly the same input -- only throughput differs. Setting the macro project-wide is therefore
|
|
||||||
safe even when some translation units are built with an older standard.
|
|
||||||
|
|
||||||
!!! warning "Define consistently"
|
|
||||||
|
|
||||||
The macro selects between two definitions of the same inline validation function. It must therefore be defined
|
|
||||||
identically for **every** translation unit that includes the library; mixing translation units that define it with
|
|
||||||
ones that do not is an ODR violation. Prefer setting it as a compile definition on the target rather than with
|
|
||||||
`#!cpp #define` in individual source files.
|
|
||||||
|
|
||||||
## Default definition
|
|
||||||
|
|
||||||
By default, `#!cpp JSON_USE_SIMDUTF` is not defined and the portable C++11 scalar validator is used.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#undef JSON_USE_SIMDUTF
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
??? example
|
|
||||||
|
|
||||||
The code below enables the simdutf backend for UTF-8 validation.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#define JSON_USE_SIMDUTF 1
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
The project must also link against simdutf, e.g. with CMake:
|
|
||||||
|
|
||||||
```cmake
|
|
||||||
target_compile_definitions(your_target PRIVATE JSON_USE_SIMDUTF)
|
|
||||||
target_link_libraries(your_target PRIVATE simdutf::simdutf)
|
|
||||||
```
|
|
||||||
|
|
||||||
!!! hint "Testing this configuration"
|
|
||||||
|
|
||||||
The unit tests can be built against the simdutf backend with the CMake option `JSON_TestSimdutf` (`OFF` by
|
|
||||||
default), which fetches simdutf and defines `JSON_USE_SIMDUTF` for every test target. The `ci_test_simdutf` target
|
|
||||||
runs the whole test suite in that configuration.
|
|
||||||
|
|
||||||
## Version history
|
|
||||||
|
|
||||||
- Added in version 3.13.0.
|
|
||||||
@@ -57,8 +57,7 @@ Summary:
|
|||||||
: name of the base type (class, struct) `type` is derived from
|
: name of the base type (class, struct) `type` is derived from
|
||||||
|
|
||||||
`member` (in)
|
`member` (in)
|
||||||
: name of the member variable to serialize/deserialize; up to 63 members can be given as a comma-separated
|
: name of the member variable to serialize/deserialize; up to 63 members can be given as a comma-separated list
|
||||||
list, which may also be empty
|
|
||||||
|
|
||||||
## Default definition
|
## Default definition
|
||||||
|
|
||||||
@@ -128,20 +127,6 @@ void to_json(BasicJsonType& j, const B& b) {
|
|||||||
- Macros 4, 5, and 6 have the same prerequisites of [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE](nlohmann_define_type_non_intrusive.md).
|
- Macros 4, 5, and 6 have the same prerequisites of [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE](nlohmann_define_type_non_intrusive.md).
|
||||||
- Serialization/deserialization of base types must be defined.
|
- Serialization/deserialization of base types must be defined.
|
||||||
|
|
||||||
!!! info "Derived types without own members"
|
|
||||||
|
|
||||||
The member list may be empty. The macro then generates a `to_json`/`from_json` pair that only delegates to
|
|
||||||
the base type, so `type` serializes exactly like `base_type`:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
struct derived : base
|
|
||||||
{
|
|
||||||
NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(derived, base)
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
The `WITH_NAMES` variants do not support this.
|
|
||||||
|
|
||||||
!!! warning "Implementation limits"
|
!!! warning "Implementation limits"
|
||||||
|
|
||||||
See Implementation limits for [NLOHMANN_DEFINE_TYPE_INTRUSIVE](nlohmann_define_type_intrusive.md) and
|
See Implementation limits for [NLOHMANN_DEFINE_TYPE_INTRUSIVE](nlohmann_define_type_intrusive.md) and
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ Summary:
|
|||||||
: name of the type (class, struct) to serialize/deserialize
|
: name of the type (class, struct) to serialize/deserialize
|
||||||
|
|
||||||
`member` (in)
|
`member` (in)
|
||||||
: name of the member variable to serialize/deserialize; up to 63 members can be given as a comma-separated
|
: name of the member variable to serialize/deserialize; up to 63 members can be given as a comma-separated list
|
||||||
list, which may also be empty
|
|
||||||
|
|
||||||
## Default definition
|
## Default definition
|
||||||
|
|
||||||
@@ -59,20 +58,6 @@ See the examples below for the concrete generated code.
|
|||||||
|
|
||||||
[GetNonDefNonCopy]: ../../features/arbitrary_types.md#how-can-i-use-get-for-non-default-constructiblenon-copyable-types
|
[GetNonDefNonCopy]: ../../features/arbitrary_types.md#how-can-i-use-get-for-non-default-constructiblenon-copyable-types
|
||||||
|
|
||||||
!!! info "Types without members"
|
|
||||||
|
|
||||||
The member list may be empty. The macro then generates a `to_json` that produces an empty JSON object
|
|
||||||
`#!json {}`, and a `from_json` that reads no members:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
struct marker
|
|
||||||
{
|
|
||||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE(marker)
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
The `WITH_NAMES` variants do not support this.
|
|
||||||
|
|
||||||
!!! warning "Implementation limits"
|
!!! warning "Implementation limits"
|
||||||
|
|
||||||
- The current implementation is limited to at most 63 member variables. If you want to serialize/deserialize types
|
- The current implementation is limited to at most 63 member variables. If you want to serialize/deserialize types
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ Summary:
|
|||||||
: name of the type (class, struct) to serialize/deserialize
|
: name of the type (class, struct) to serialize/deserialize
|
||||||
|
|
||||||
`member` (in)
|
`member` (in)
|
||||||
: name of the (public) member variable to serialize/deserialize; up to 63 members can be given as a
|
: name of the (public) member variable to serialize/deserialize; up to 63 members can be given as a comma-separated list
|
||||||
comma-separated list, which may also be empty
|
|
||||||
|
|
||||||
## Default definition
|
## Default definition
|
||||||
|
|
||||||
@@ -60,18 +59,6 @@ See the examples below for the concrete generated code.
|
|||||||
|
|
||||||
[GetNonDefNonCopy]: ../../features/arbitrary_types.md#how-can-i-use-get-for-non-default-constructiblenon-copyable-types
|
[GetNonDefNonCopy]: ../../features/arbitrary_types.md#how-can-i-use-get-for-non-default-constructiblenon-copyable-types
|
||||||
|
|
||||||
!!! info "Types without members"
|
|
||||||
|
|
||||||
The member list may be empty. The macro then generates a `to_json` that produces an empty JSON object
|
|
||||||
`#!json {}`, and a `from_json` that reads no members:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
struct marker {};
|
|
||||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(marker)
|
|
||||||
```
|
|
||||||
|
|
||||||
The `WITH_NAMES` variants do not support this.
|
|
||||||
|
|
||||||
!!! warning "Implementation limits"
|
!!! warning "Implementation limits"
|
||||||
|
|
||||||
- The current implementation is limited to at most 63 member variables. If you want to serialize/deserialize types
|
- The current implementation is limited to at most 63 member variables. If you want to serialize/deserialize types
|
||||||
|
|||||||
@@ -33,54 +33,30 @@ A UTF-8 byte order mark is silently ignored.
|
|||||||
Invalid Unicode escapes and unpaired surrogates in the input are reported as
|
Invalid Unicode escapes and unpaired surrogates in the input are reported as
|
||||||
[`parse_error.101`](../home/exceptions.md#jsonexceptionparse_error101) with a detailed message.
|
[`parse_error.101`](../home/exceptions.md#jsonexceptionparse_error101) with a detailed message.
|
||||||
|
|
||||||
`operator>>` parses exactly one JSON value, so it can be called repeatedly to read a sequence of concatenated JSON
|
`operator>>` parses exactly one JSON value and leaves the stream positioned right after it, so it can be called
|
||||||
values from the same stream:
|
repeatedly to read a sequence of concatenated JSON values from the same stream:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
json j1, j2;
|
std::istringstream input("1true[2]");
|
||||||
input >> j1; // parses the first value
|
json j1, j2, j3;
|
||||||
input >> j2; // parses the next value
|
input >> j1; // j1 == 1, stream now positioned right after it
|
||||||
|
input >> j2; // j2 == true
|
||||||
|
input >> j3; // j3 == [2]
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! warning "A number must be followed by whitespace"
|
!!! note "Changed behavior for numbers"
|
||||||
|
|
||||||
A number is only terminated by the character that follows it. That character is read from the stream to detect the
|
A number is the only value whose end can be detected solely by reading the character that follows it. Up to
|
||||||
end of the number, and it is **not** put back. When a value that is a number is immediately followed by the next
|
version 3.13.0 that character was consumed and not put back, so the stream was left one byte too far whenever a
|
||||||
value, the first character of that next value is lost:
|
number was immediately followed by another value: reading `1true` yielded `1` and left the stream at `rue`.
|
||||||
|
Values had to be separated by whitespace to work around this.
|
||||||
|
|
||||||
```cpp
|
The terminating character is now only looked at and left in the stream, so no separator is required. Code that
|
||||||
std::istringstream input("1true");
|
relied on the extra byte being swallowed will observe it again.
|
||||||
json j1, j2;
|
|
||||||
input >> j1; // j1 == 1
|
|
||||||
input >> j2; // throws parse_error.101: the stream now starts at "rue"
|
|
||||||
```
|
|
||||||
|
|
||||||
Separating the values with whitespace avoids this, because the character that is eaten is then the separator:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
std::istringstream input("1 true");
|
|
||||||
json j1, j2;
|
|
||||||
input >> j1; // j1 == 1
|
|
||||||
input >> j2; // j2 == true
|
|
||||||
```
|
|
||||||
|
|
||||||
Only numbers are affected. Values ending in a self-delimiting character do not read past themselves, so
|
|
||||||
`truefalse`, `[1][2]`, `{"a":1}{"b":2}`, and `"a""b"` can be read back to back without a separator.
|
|
||||||
|
|
||||||
Define [`JSON_PRECISE_STREAM_POSITION`](macros/json_precise_stream_position.md) to `1` to leave the terminating character in the stream
|
|
||||||
instead, so that the stream is positioned right after the value for every value type and no separator is
|
|
||||||
needed. This is tracked in [#5340](https://github.com/nlohmann/json/issues/5340).
|
|
||||||
|
|
||||||
Note that reading concatenated values does **not** work for [JSON Lines](../features/parsing/json_lines.md)
|
Note that reading concatenated values does **not** work for [JSON Lines](../features/parsing/json_lines.md)
|
||||||
(newline-delimited JSON) input -- see that page for why and for the recommended alternative.
|
(newline-delimited JSON) input -- see that page for why and for the recommended alternative.
|
||||||
|
|
||||||
By default, a `'\0'` (NUL) byte encountered while reading a value is treated as end of input, rather than as an
|
|
||||||
ordinary (and, outside of a string, invalid) byte; see the [FAQ entry](../home/faq.md#nul-bytes-in-the-input) for
|
|
||||||
details and the [`JSON_STRICT_NUL_HANDLING`](macros/json_strict_nul_handling.md) macro to opt into rejecting it
|
|
||||||
instead. Because `operator>>` only parses a single value and does not require the rest of the stream to be consumed,
|
|
||||||
a NUL byte *after* a complete value has no effect on `operator>>` either way; it only matters while a value is still
|
|
||||||
being read.
|
|
||||||
|
|
||||||
!!! warning "Deprecation"
|
!!! warning "Deprecation"
|
||||||
|
|
||||||
This function replaces function `#!cpp std::istream& operator<<(basic_json& j, std::istream& i)` which has
|
This function replaces function `#!cpp std::istream& operator<<(basic_json& j, std::istream& i)` which has
|
||||||
@@ -107,14 +83,9 @@ being read.
|
|||||||
|
|
||||||
- [accept](basic_json/accept.md) - check if the input is valid JSON
|
- [accept](basic_json/accept.md) - check if the input is valid JSON
|
||||||
- [parse](basic_json/parse.md) - deserialize from a compatible input
|
- [parse](basic_json/parse.md) - deserialize from a compatible input
|
||||||
- [`JSON_STRICT_NUL_HANDLING`](macros/json_strict_nul_handling.md) - opt in to rejecting a NUL byte in the input
|
|
||||||
instead of treating it as end of input
|
|
||||||
- [`JSON_PRECISE_STREAM_POSITION`](macros/json_precise_stream_position.md) - opt in to leaving the stream positioned right after a number
|
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 1.0.0.
|
- Added in version 1.0.0.
|
||||||
- `JSON_STRICT_NUL_HANDLING` added in version 3.13.0 to optionally reject a NUL byte in the input instead of treating
|
- Changed in version 4.0.0 to leave the character that terminates a number in the stream, so that the stream is
|
||||||
it as end of input; planned to become the default in version 4.0.0.
|
positioned right after the parsed value for every value type.
|
||||||
- `JSON_PRECISE_STREAM_POSITION` added in version 3.13.0 to optionally leave the character that terminates a number in
|
|
||||||
the stream; planned to become the default in version 4.0.0.
|
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
# Assurance case
|
|
||||||
|
|
||||||
This page argues why the library meets its security requirements. It describes the threats the library faces, where the
|
|
||||||
trust boundaries lie, and how the library's design and the [quality assurance](quality_assurance.md) counter these
|
|
||||||
threats. To report a vulnerability, see the [security policy](security_policy.md).
|
|
||||||
|
|
||||||
## Threat model
|
|
||||||
|
|
||||||
The library parses, stores, and serializes JSON values in memory. It does not open network connections, does not open
|
|
||||||
files (it only reads from streams or `std::FILE*` handles that the caller has already opened), does not read environment
|
|
||||||
variables, and does not implement cryptography or handle credentials.
|
|
||||||
|
|
||||||
The primary threat is therefore **untrusted input**: JSON text or binary data (BJData, BSON, CBOR, MessagePack, UBJSON)
|
|
||||||
that an attacker controls, passed to [`parse`](../api/basic_json/parse.md), [`accept`](../api/basic_json/accept.md),
|
|
||||||
[`sax_parse`](../api/basic_json/sax_parse.md), or one of the `from_*` functions such as
|
|
||||||
[`from_cbor`](../api/basic_json/from_cbor.md). Such input may try to
|
|
||||||
|
|
||||||
- make the library read or write out of bounds (malformed lengths, truncated input, invalid UTF-8),
|
|
||||||
- trigger undefined behavior (integer overflow in sizes or numbers, invalid casts),
|
|
||||||
- exhaust memory (huge announced sizes), or
|
|
||||||
- exhaust the call stack (deeply nested arrays and objects).
|
|
||||||
|
|
||||||
## Trust boundaries
|
|
||||||
|
|
||||||
- **Untrusted:** all serialized input read by the parser, the SAX interface, and the binary readers. The library must
|
|
||||||
handle every possible input by either producing a value or throwing a [`parse_error`](../home/exceptions.md#parse-errors)
|
|
||||||
(or returning `false` when exceptions are disabled for the call).
|
|
||||||
- **Trusted:** the C++ code that calls the library. Calling a function with violated preconditions, for instance
|
|
||||||
accessing an array with [`operator[]`](../api/basic_json/operator%5B%5D.md) out of range, is a programming error and
|
|
||||||
not a security boundary. Such preconditions are checked with [runtime assertions](../features/assertions.md) in debug
|
|
||||||
builds; functions such as [`at`](../api/basic_json/at.md) offer checked access with exceptions.
|
|
||||||
|
|
||||||
## Secure design
|
|
||||||
|
|
||||||
- **Strict parsing.** The parser accepts exactly the JSON grammar of [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259).
|
|
||||||
Extensions such as [comments](../features/comments.md) and [trailing commas](../features/trailing_commas.md) must be
|
|
||||||
enabled explicitly. Invalid UTF-8 is rejected.
|
|
||||||
- **Errors are reported, not ignored.** Malformed input results in a [`parse_error`](../home/exceptions.md#parse-errors)
|
|
||||||
with the byte position of the error. Binary readers do not trust announced sizes: strings and binary values grow
|
|
||||||
only as bytes are actually read, arrays reserve at most a fixed number of elements up front, and sizes that no
|
|
||||||
container can hold are rejected.
|
|
||||||
- **Memory is owned by values.** Each `basic_json` value owns its content, and there is no manual memory management in
|
|
||||||
user code. The destructor does not recurse, so destroying a deeply nested value does not exhaust the stack.
|
|
||||||
- **Bounded recursion.** The JSON parser and the binary readers keep their state in explicit stacks instead of
|
|
||||||
recursing per nesting level. Operations that walk a value, such as [`dump`](../api/basic_json/dump.md), copying,
|
|
||||||
comparison, hashing, and [`merge_patch`](../api/basic_json/merge_patch.md), recurse only up to a fixed depth and
|
|
||||||
continue with an explicit stack below it. Some operations, such as [`diff`](../api/basic_json/diff.md),
|
|
||||||
[`flatten`](../api/basic_json/flatten.md), and the binary writers, still recurse once per nesting level; work on them
|
|
||||||
is in progress. Applications that process untrusted input can limit its nesting depth with a
|
|
||||||
[parser callback](../features/parsing/parser_callbacks.md).
|
|
||||||
- **Invariants are checked.** The class invariant (for instance, that the pointer for the stored type is never null) is
|
|
||||||
checked with runtime assertions throughout the test suite.
|
|
||||||
|
|
||||||
## Common weaknesses
|
|
||||||
|
|
||||||
The following table maps the relevant classes of the [Common Weakness Enumeration](https://cwe.mitre.org) to the
|
|
||||||
measures that counter them. The measures are described in detail in [Quality assurance](quality_assurance.md).
|
|
||||||
|
|
||||||
| Weakness | Countermeasures |
|
|
||||||
|---------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
|
|
||||||
| Out-of-bounds read/write ([CWE-125](https://cwe.mitre.org/data/definitions/125.html), [CWE-787](https://cwe.mitre.org/data/definitions/787.html)) | bounds checks on all reads from the input; AddressSanitizer and Valgrind on the test suite; OSS-Fuzz |
|
|
||||||
| Integer overflow ([CWE-190](https://cwe.mitre.org/data/definitions/190.html)) | UndefinedBehaviorSanitizer with integer overflow detection; Clang-Tidy; Cppcheck |
|
|
||||||
| Use after free, double free ([CWE-416](https://cwe.mitre.org/data/definitions/416.html), [CWE-415](https://cwe.mitre.org/data/definitions/415.html)) | ownership of all memory by values; AddressSanitizer and Valgrind; Clang Static Analyzer |
|
|
||||||
| Memory leaks ([CWE-401](https://cwe.mitre.org/data/definitions/401.html)) | Valgrind (Memcheck) on the test suite |
|
|
||||||
| Uncontrolled recursion ([CWE-674](https://cwe.mitre.org/data/definitions/674.html)) | iterative parser, binary readers, and destructor; bounded recursion in value operations; tests with deeply nested inputs |
|
|
||||||
| Uncontrolled resource consumption ([CWE-400](https://cwe.mitre.org/data/definitions/400.html)) | allocations based on announced sizes are capped; OSS-Fuzz with memory limits |
|
|
||||||
| Undefined behavior in general ([CWE-758](https://cwe.mitre.org/data/definitions/758.html)) | UndefinedBehaviorSanitizer; runtime assertions; Clang-Tidy, Cppcheck, Clang Static Analyzer, Infer |
|
|
||||||
|
|
||||||
In addition, every line of the library is covered by the unit tests, and all parsers are fuzz-tested around the clock
|
|
||||||
by [OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json).
|
|
||||||
@@ -91,31 +91,6 @@ activities include (but are not limited to):
|
|||||||
Users who continue to engage with the project and its community will often find themselves becoming more and more
|
Users who continue to engage with the project and its community will often find themselves becoming more and more
|
||||||
involved. Such users may then go on to become contributors, as described above.
|
involved. Such users may then go on to become contributors, as described above.
|
||||||
|
|
||||||
## Access to project resources
|
|
||||||
|
|
||||||
The project's resources are the [GitHub repository](https://github.com/nlohmann/json) with its settings, CI workflows
|
|
||||||
and secrets, and the documentation at [json.nlohmann.me](https://json.nlohmann.me), which is built and deployed from
|
|
||||||
the repository. Currently, the project lead is the only person with write or admin access to them.
|
|
||||||
|
|
||||||
### Granting access
|
|
||||||
|
|
||||||
Write or admin access is only granted by the project lead, and only to a contributor whose track record in the project
|
|
||||||
the project lead has reviewed first. The role is assigned manually and is the lowest one that is needed for the task.
|
|
||||||
Access is removed when it is no longer needed. GitHub requires two-factor authentication for everyone who can modify the
|
|
||||||
repository.
|
|
||||||
|
|
||||||
### Secrets
|
|
||||||
|
|
||||||
The CI workflows mostly use the token that GitHub creates for each workflow run. It is read-only by default, and each
|
|
||||||
workflow requests only the additional permissions it needs. The few other credentials, such as the token for
|
|
||||||
[Semgrep](https://semgrep.dev), are stored as encrypted GitHub Actions secrets:
|
|
||||||
|
|
||||||
- Only people with admin access can create, change, or delete them. Their values cannot be read back, not even by
|
|
||||||
admins.
|
|
||||||
- They are not passed to workflows that run for pull requests from forks.
|
|
||||||
- They must never be committed to the repository or printed in logs.
|
|
||||||
- They are rotated whenever someone with admin access leaves the project, and immediately if a leak is suspected.
|
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
All participants in the community are encouraged to provide support for new users within the project management
|
All participants in the community are encouraged to provide support for new users within the project management
|
||||||
|
|||||||
@@ -5,6 +5,4 @@
|
|||||||
- [Contribution Guidelines](contribution_guidelines.md) - guidelines how to contribute to this project
|
- [Contribution Guidelines](contribution_guidelines.md) - guidelines how to contribute to this project
|
||||||
- [Governance](governance.md) - the governance model of this project
|
- [Governance](governance.md) - the governance model of this project
|
||||||
- [Quality Assurance](quality_assurance.md) - how the quality of this project is assured
|
- [Quality Assurance](quality_assurance.md) - how the quality of this project is assured
|
||||||
- [Roadmap](roadmap.md) - what the project will and will not do
|
|
||||||
- [Security Policy](security_policy.md) - the security policy of the project
|
- [Security Policy](security_policy.md) - the security policy of the project
|
||||||
- [Assurance Case](assurance_case.md) - why the library meets its security requirements
|
|
||||||
|
|||||||
@@ -164,9 +164,6 @@ Note: Some modern features (like C++20 ranges or filesystem support) may be disa
|
|||||||
- [x] The parser is tested against extensive correctness suites for JSON compliance.
|
- [x] The parser is tested against extensive correctness suites for JSON compliance.
|
||||||
- [x] In addition, the library is continuously fuzz-tested at [OSS-Fuzz](https://google.github.io/oss-fuzz/) where the
|
- [x] In addition, the library is continuously fuzz-tested at [OSS-Fuzz](https://google.github.io/oss-fuzz/) where the
|
||||||
library is checked against billions of inputs.
|
library is checked against billions of inputs.
|
||||||
- [x] Every crash reported by OSS-Fuzz is fixed together with a unit test that reproduces it, and the fix references
|
|
||||||
the OSS-Fuzz issue. The round-trip checks of the fuzzer drivers are also part of the unit tests. See the
|
|
||||||
[fuzz testing documentation](https://github.com/nlohmann/json/blob/develop/tests/fuzzing.md#handling-oss-fuzz-reports).
|
|
||||||
|
|
||||||
## Static analysis
|
## Static analysis
|
||||||
|
|
||||||
@@ -200,25 +197,6 @@ Note: Some modern features (like C++20 ranges or filesystem support) may be disa
|
|||||||
- [x] The test suite is executed with [Sanitizers](https://github.com/google/sanitizers) (address sanitizer, undefined
|
- [x] The test suite is executed with [Sanitizers](https://github.com/google/sanitizers) (address sanitizer, undefined
|
||||||
behavior sanitizer, integer overflow detection, nullability violations).
|
behavior sanitizer, integer overflow detection, nullability violations).
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
!!! success "Requirement: No vulnerable dependencies"
|
|
||||||
|
|
||||||
The library has no dependencies besides the C++ standard library. The tools used to build, test, and document it
|
|
||||||
are kept free of known vulnerabilities.
|
|
||||||
|
|
||||||
- [x] GitHub Actions are pinned to a commit hash, and the Python packages used by the documentation and the tools are
|
|
||||||
pinned to exact versions.
|
|
||||||
- [x] [Dependabot](https://docs.github.com/en/code-security/dependabot) checks these dependencies daily and proposes
|
|
||||||
updates as pull requests.
|
|
||||||
- [x] Every pull request is checked with the
|
|
||||||
[dependency review action](https://github.com/actions/dependency-review-action). A pull request that adds a
|
|
||||||
dependency with a known vulnerability of any severity fails this check and is not merged.
|
|
||||||
- [x] Vulnerability alerts for dependencies are fixed or dismissed with a documented reason before the next release.
|
|
||||||
No release is made while such an alert is open.
|
|
||||||
- [x] Third-party code included in the repository for testing, such as [doctest](https://github.com/doctest/doctest),
|
|
||||||
is updated manually.
|
|
||||||
|
|
||||||
## Style check
|
## Style check
|
||||||
|
|
||||||
!!! success "Requirement: Common code style"
|
!!! success "Requirement: Common code style"
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
# Roadmap
|
|
||||||
|
|
||||||
This page describes what the project intends to do, and what it does not intend to do, over the next year. Concrete
|
|
||||||
work items are tracked in the [GitHub milestones](https://github.com/nlohmann/json/milestones) and the
|
|
||||||
[issue tracker](https://github.com/nlohmann/json/issues).
|
|
||||||
|
|
||||||
## What the project will do
|
|
||||||
|
|
||||||
- **Keep the C++11 baseline.** The library will continue to compile with every
|
|
||||||
[supported C++11 compiler](https://github.com/nlohmann/json/blob/develop/README.md#supported-compilers). Features of
|
|
||||||
later standards are only used when they are guarded by the `JSON_HAS_CPP_*` macros.
|
|
||||||
- **Stay conformant to JSON.** The parser and serializer follow [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259).
|
|
||||||
Extensions such as [comments](../features/comments.md) or [trailing commas](../features/trailing_commas.md) remain
|
|
||||||
opt-in.
|
|
||||||
- **Keep the 3.x public API stable.** Releases follow [semantic versioning](https://semver.org). Changes that would
|
|
||||||
break existing code are only added behind a feature macro, so users can opt in and test their code before a next
|
|
||||||
major release.
|
|
||||||
- **Support a broad range of compilers and platforms.** The [CI](quality_assurance.md) keeps testing old and new
|
|
||||||
versions of GCC, Clang, MSVC, and other compilers on Linux, macOS, and Windows.
|
|
||||||
- **Keep the quality assurance up.** Every change keeps the test coverage at 100%, passes the static and dynamic
|
|
||||||
analysis, and is fuzz-tested by OSS-Fuzz, see [Quality assurance](quality_assurance.md).
|
|
||||||
- **Harden the library against hostile input.** Handling deeply nested values without exhausting the call stack is
|
|
||||||
ongoing work.
|
|
||||||
- **Fix bugs and security issues** reported through the issue tracker and the [security policy](security_policy.md).
|
|
||||||
|
|
||||||
## What the project will not do
|
|
||||||
|
|
||||||
- **Break the public API of version 3.x.** See the
|
|
||||||
[contribution guidelines](https://github.com/nlohmann/json/blob/develop/.github/CONTRIBUTING.md#break-the-public-api)
|
|
||||||
for what counts as a breaking change.
|
|
||||||
- **Require a newer C++ standard than C++11.**
|
|
||||||
- **Break JSON conformance** or enable non-standard extensions by default.
|
|
||||||
- **Add dependencies** or require a build step. The library remains header-only, and the single header
|
|
||||||
`json.hpp` remains a complete distribution.
|
|
||||||
- **Trade simplicity for speed or memory efficiency.** Performance improvements are welcome, but the library is not
|
|
||||||
meant to compete with the fastest JSON libraries, see [Design goals](../home/design_goals.md).
|
|
||||||
|
|
||||||
## Version 4.0
|
|
||||||
|
|
||||||
There is no decision yet on whether or when a version 4.0 with breaking changes will be released. Proposals that need
|
|
||||||
a major version, for instance stricter type conversions, are collected in issue
|
|
||||||
[#3453](https://github.com/nlohmann/json/issues/3453). Until then, such changes are only added as opt-in behavior
|
|
||||||
behind feature macros.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
#include "custom_array_type.hpp"
|
|
||||||
|
|
||||||
using custom_json = nlohmann::basic_json<std::map, custom_array_type>;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
custom_json j = custom_json::array();
|
|
||||||
j.push_back(1);
|
|
||||||
j.push_back(2);
|
|
||||||
j.push_back(3);
|
|
||||||
|
|
||||||
std::cout << j.dump() << std::endl;
|
|
||||||
std::cout << std::boolalpha << (custom_json::parse(j.dump()) == j) << std::endl;
|
|
||||||
}
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
// A minimal, self-contained ArrayType built around a private std::vector.
|
|
||||||
// See https://json.nlohmann.me/features/types/template_parameters/#arraytype
|
|
||||||
template<class T, class Allocator = std::allocator<T>>
|
|
||||||
class custom_array_type
|
|
||||||
{
|
|
||||||
using vector_t = std::vector<T, Allocator>;
|
|
||||||
vector_t data_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using value_type = typename vector_t::value_type;
|
|
||||||
using size_type = typename vector_t::size_type;
|
|
||||||
using iterator = typename vector_t::iterator;
|
|
||||||
using const_iterator = typename vector_t::const_iterator;
|
|
||||||
|
|
||||||
custom_array_type() = default;
|
|
||||||
custom_array_type(const custom_array_type&) = default;
|
|
||||||
custom_array_type(custom_array_type&&) = default;
|
|
||||||
custom_array_type& operator=(const custom_array_type&) = default;
|
|
||||||
custom_array_type& operator=(custom_array_type&&) = default;
|
|
||||||
|
|
||||||
template<class InputIt>
|
|
||||||
custom_array_type(InputIt first, InputIt last) : data_(first, last) {}
|
|
||||||
|
|
||||||
custom_array_type(size_type count, const T& value) : data_(count, value) {}
|
|
||||||
|
|
||||||
iterator begin()
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
iterator end()
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator begin() const
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
const_iterator end() const
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator cbegin() const
|
|
||||||
{
|
|
||||||
return data_.cbegin();
|
|
||||||
}
|
|
||||||
const_iterator cend() const
|
|
||||||
{
|
|
||||||
return data_.cend();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool empty() const
|
|
||||||
{
|
|
||||||
return data_.empty();
|
|
||||||
}
|
|
||||||
size_type size() const
|
|
||||||
{
|
|
||||||
return data_.size();
|
|
||||||
}
|
|
||||||
size_type max_size() const
|
|
||||||
{
|
|
||||||
return data_.max_size();
|
|
||||||
}
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
data_.clear();
|
|
||||||
}
|
|
||||||
void resize(size_type n)
|
|
||||||
{
|
|
||||||
data_.resize(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
T& operator[](size_type pos)
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
const T& operator[](size_type pos) const
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
T& back()
|
|
||||||
{
|
|
||||||
return data_.back();
|
|
||||||
}
|
|
||||||
const T& back() const
|
|
||||||
{
|
|
||||||
return data_.back();
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_back(const T& value)
|
|
||||||
{
|
|
||||||
data_.push_back(value);
|
|
||||||
}
|
|
||||||
void push_back(T&& value)
|
|
||||||
{
|
|
||||||
data_.push_back(std::move(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class... Args>
|
|
||||||
void emplace_back(Args&& ... args)
|
|
||||||
{
|
|
||||||
data_.emplace_back(std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pop_back()
|
|
||||||
{
|
|
||||||
data_.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator insert(const_iterator pos, const T& value)
|
|
||||||
{
|
|
||||||
return data_.insert(pos, value);
|
|
||||||
}
|
|
||||||
iterator insert(const_iterator pos, size_type count, const T& value)
|
|
||||||
{
|
|
||||||
return data_.insert(pos, count, value);
|
|
||||||
}
|
|
||||||
template<class InputIt>
|
|
||||||
iterator insert(const_iterator pos, InputIt first, InputIt last)
|
|
||||||
{
|
|
||||||
return data_.insert(pos, first, last);
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator erase(const_iterator pos)
|
|
||||||
{
|
|
||||||
return data_.erase(pos);
|
|
||||||
}
|
|
||||||
iterator erase(const_iterator first, const_iterator last)
|
|
||||||
{
|
|
||||||
return data_.erase(first, last);
|
|
||||||
}
|
|
||||||
|
|
||||||
void swap(custom_array_type& other)
|
|
||||||
{
|
|
||||||
data_.swap(other.data_);
|
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator==(const custom_array_type& lhs, const custom_array_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ == rhs.data_;
|
|
||||||
}
|
|
||||||
friend bool operator<(const custom_array_type& lhs, const custom_array_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ < rhs.data_;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[1,2,3]
|
|
||||||
true
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#include <cstdint>
|
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
#include "custom_binary_type.hpp"
|
|
||||||
|
|
||||||
using custom_json = nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
|
||||||
std::int64_t, std::uint64_t, double, std::allocator,
|
|
||||||
nlohmann::adl_serializer, custom_binary_type>;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
const auto j = custom_json::binary({0x01, 0x02, 0x03});
|
|
||||||
|
|
||||||
std::cout << j.dump() << std::endl;
|
|
||||||
std::cout << std::boolalpha << (custom_json::from_cbor(custom_json::to_cbor(j)) == j) << std::endl;
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <initializer_list>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
// A minimal, self-contained BinaryType built around a private std::vector.
|
|
||||||
// See https://json.nlohmann.me/features/types/template_parameters/#binarytype
|
|
||||||
class custom_binary_type
|
|
||||||
{
|
|
||||||
using vector_t = std::vector<std::uint8_t>;
|
|
||||||
vector_t data_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using value_type = vector_t::value_type;
|
|
||||||
using size_type = vector_t::size_type;
|
|
||||||
using iterator = vector_t::iterator;
|
|
||||||
using const_iterator = vector_t::const_iterator;
|
|
||||||
|
|
||||||
custom_binary_type() = default;
|
|
||||||
custom_binary_type(const custom_binary_type&) = default;
|
|
||||||
custom_binary_type(custom_binary_type&&) = default;
|
|
||||||
custom_binary_type& operator=(const custom_binary_type&) = default;
|
|
||||||
custom_binary_type& operator=(custom_binary_type&&) = default;
|
|
||||||
|
|
||||||
template<class InputIt>
|
|
||||||
custom_binary_type(InputIt first, InputIt last) : data_(first, last) {}
|
|
||||||
|
|
||||||
// so basic_json::binary({0x01, 0x02}) can build one directly
|
|
||||||
custom_binary_type(std::initializer_list<std::uint8_t> init) : data_(init) {}
|
|
||||||
|
|
||||||
size_type size() const
|
|
||||||
{
|
|
||||||
return data_.size();
|
|
||||||
}
|
|
||||||
bool empty() const
|
|
||||||
{
|
|
||||||
return data_.empty();
|
|
||||||
}
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
data_.clear();
|
|
||||||
}
|
|
||||||
void resize(size_type n)
|
|
||||||
{
|
|
||||||
data_.resize(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
// read-only is enough: the writers only ever read from a binary value
|
|
||||||
const std::uint8_t* data() const
|
|
||||||
{
|
|
||||||
return data_.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint8_t& operator[](size_type pos)
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
std::uint8_t operator[](size_type pos) const
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint8_t& back()
|
|
||||||
{
|
|
||||||
return data_.back();
|
|
||||||
}
|
|
||||||
std::uint8_t back() const
|
|
||||||
{
|
|
||||||
return data_.back();
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator begin()
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
iterator end()
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator begin() const
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
const_iterator end() const
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator cbegin() const
|
|
||||||
{
|
|
||||||
return data_.cbegin();
|
|
||||||
}
|
|
||||||
const_iterator cend() const
|
|
||||||
{
|
|
||||||
return data_.cend();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class InputIt>
|
|
||||||
iterator insert(const_iterator pos, InputIt first, InputIt last)
|
|
||||||
{
|
|
||||||
return data_.insert(pos, first, last);
|
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator==(const custom_binary_type& lhs, const custom_binary_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ == rhs.data_;
|
|
||||||
}
|
|
||||||
friend bool operator<(const custom_binary_type& lhs, const custom_binary_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ < rhs.data_;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
{"bytes":[1,2,3],"subtype":null}
|
|
||||||
true
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
#include "custom_object_type.hpp"
|
|
||||||
|
|
||||||
using custom_json = nlohmann::basic_json<custom_object_type, std::vector>;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
custom_json j;
|
|
||||||
j["pi"] = 3.141;
|
|
||||||
j["happy"] = true;
|
|
||||||
j["list"] = {1, 2, 3};
|
|
||||||
|
|
||||||
std::cout << j.dump(2) << std::endl;
|
|
||||||
std::cout << std::boolalpha << (custom_json::parse(j.dump()) == j) << std::endl;
|
|
||||||
|
|
||||||
// custom_object_type has no key_compare member, so object_comparator_t
|
|
||||||
// falls back to its default
|
|
||||||
std::cout << std::boolalpha
|
|
||||||
<< std::is_same<custom_json::object_comparator_t, custom_json::default_object_comparator_t>::value
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
// A minimal, self-contained ObjectType built around a private std::map.
|
|
||||||
// key_compare is deliberately not exposed: when an ObjectType has no
|
|
||||||
// key_compare member, the library falls back to its own default comparator.
|
|
||||||
// See https://json.nlohmann.me/features/types/template_parameters/#objecttype
|
|
||||||
template<class Key, class T, class Compare, class Allocator>
|
|
||||||
class custom_object_type
|
|
||||||
{
|
|
||||||
using map_t = std::map<Key, T, Compare, Allocator>;
|
|
||||||
map_t data_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using key_type = typename map_t::key_type;
|
|
||||||
using mapped_type = typename map_t::mapped_type;
|
|
||||||
using value_type = typename map_t::value_type;
|
|
||||||
using size_type = typename map_t::size_type;
|
|
||||||
using iterator = typename map_t::iterator;
|
|
||||||
using const_iterator = typename map_t::const_iterator;
|
|
||||||
|
|
||||||
custom_object_type() = default;
|
|
||||||
custom_object_type(const custom_object_type&) = default;
|
|
||||||
custom_object_type(custom_object_type&&) = default;
|
|
||||||
custom_object_type& operator=(const custom_object_type&) = default;
|
|
||||||
custom_object_type& operator=(custom_object_type&&) = default;
|
|
||||||
|
|
||||||
template<class InputIt>
|
|
||||||
custom_object_type(InputIt first, InputIt last) : data_(first, last) {}
|
|
||||||
|
|
||||||
iterator begin()
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
iterator end()
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator begin() const
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
const_iterator end() const
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator cbegin() const
|
|
||||||
{
|
|
||||||
return data_.cbegin();
|
|
||||||
}
|
|
||||||
const_iterator cend() const
|
|
||||||
{
|
|
||||||
return data_.cend();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool empty() const
|
|
||||||
{
|
|
||||||
return data_.empty();
|
|
||||||
}
|
|
||||||
size_type size() const
|
|
||||||
{
|
|
||||||
return data_.size();
|
|
||||||
}
|
|
||||||
size_type max_size() const
|
|
||||||
{
|
|
||||||
return data_.max_size();
|
|
||||||
}
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
data_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator find(const key_type& key)
|
|
||||||
{
|
|
||||||
return data_.find(key);
|
|
||||||
}
|
|
||||||
const_iterator find(const key_type& key) const
|
|
||||||
{
|
|
||||||
return data_.find(key);
|
|
||||||
}
|
|
||||||
size_type count(const key_type& key) const
|
|
||||||
{
|
|
||||||
return data_.count(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<iterator, bool> emplace(const key_type& key, const mapped_type& value)
|
|
||||||
{
|
|
||||||
return data_.emplace(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<iterator, bool> insert(const value_type& value)
|
|
||||||
{
|
|
||||||
return data_.insert(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class InputIt>
|
|
||||||
void insert(InputIt first, InputIt last)
|
|
||||||
{
|
|
||||||
data_.insert(first, last);
|
|
||||||
}
|
|
||||||
|
|
||||||
mapped_type& operator[](const key_type& key)
|
|
||||||
{
|
|
||||||
return data_[key];
|
|
||||||
}
|
|
||||||
|
|
||||||
mapped_type& at(const key_type& key)
|
|
||||||
{
|
|
||||||
return data_.at(key);
|
|
||||||
}
|
|
||||||
const mapped_type& at(const key_type& key) const
|
|
||||||
{
|
|
||||||
return data_.at(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator erase(iterator pos)
|
|
||||||
{
|
|
||||||
return data_.erase(pos);
|
|
||||||
}
|
|
||||||
iterator erase(iterator first, iterator last)
|
|
||||||
{
|
|
||||||
return data_.erase(first, last);
|
|
||||||
}
|
|
||||||
size_type erase(const key_type& key)
|
|
||||||
{
|
|
||||||
return data_.erase(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
void swap(custom_object_type& other)
|
|
||||||
{
|
|
||||||
data_.swap(other.data_);
|
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator==(const custom_object_type& lhs, const custom_object_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ == rhs.data_;
|
|
||||||
}
|
|
||||||
friend bool operator<(const custom_object_type& lhs, const custom_object_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ < rhs.data_;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"happy": true,
|
|
||||||
"list": [
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
3
|
|
||||||
],
|
|
||||||
"pi": 3.141
|
|
||||||
}
|
|
||||||
true
|
|
||||||
true
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
#include "custom_string_type.hpp"
|
|
||||||
|
|
||||||
using custom_json = nlohmann::basic_json<std::map, std::vector, custom_string_type>;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
custom_json j;
|
|
||||||
j["pi"] = 3.141;
|
|
||||||
j["happy"] = true;
|
|
||||||
j["list"] = {1, 2, 3};
|
|
||||||
|
|
||||||
std::cout << j.dump(2) << std::endl;
|
|
||||||
std::cout << std::boolalpha << (custom_json::parse(j.dump()) == j) << std::endl;
|
|
||||||
}
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
// A minimal, self-contained StringType built around a private std::string.
|
|
||||||
// Wraps rather than inherits, so it exposes exactly what the library needs
|
|
||||||
// and nothing more of std::string's interface.
|
|
||||||
//
|
|
||||||
// Covers the "Always required" members, the extras needed for the binary
|
|
||||||
// formats, and the extras needed for JSON Pointer / flatten / unflatten /
|
|
||||||
// diff. Extending it further (e.g. for std::hash<basic_json> or to_bson) is
|
|
||||||
// a matter of adding the extra members listed in the "Required for other
|
|
||||||
// functionality" table.
|
|
||||||
//
|
|
||||||
// See https://json.nlohmann.me/features/types/template_parameters/#stringtype
|
|
||||||
class custom_string_type
|
|
||||||
{
|
|
||||||
std::string data_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using value_type = char;
|
|
||||||
using size_type = std::string::size_type;
|
|
||||||
using iterator = std::string::iterator;
|
|
||||||
using const_iterator = std::string::const_iterator;
|
|
||||||
|
|
||||||
static constexpr size_type npos = std::string::npos;
|
|
||||||
|
|
||||||
custom_string_type() = default;
|
|
||||||
custom_string_type(const custom_string_type&) = default;
|
|
||||||
custom_string_type(custom_string_type&&) = default;
|
|
||||||
custom_string_type& operator=(const custom_string_type&) = default;
|
|
||||||
custom_string_type& operator=(custom_string_type&&) = default;
|
|
||||||
|
|
||||||
// not explicit: the library relies on being able to hand it a string literal
|
|
||||||
custom_string_type(const char* s) : data_(s) {}
|
|
||||||
custom_string_type(const char* s, size_type count) : data_(s, count) {}
|
|
||||||
custom_string_type(size_type count, char ch) : data_(count, ch) {}
|
|
||||||
|
|
||||||
size_type size() const
|
|
||||||
{
|
|
||||||
return data_.size();
|
|
||||||
}
|
|
||||||
bool empty() const
|
|
||||||
{
|
|
||||||
return data_.empty();
|
|
||||||
}
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
data_.clear();
|
|
||||||
}
|
|
||||||
void resize(size_type n)
|
|
||||||
{
|
|
||||||
data_.resize(n);
|
|
||||||
}
|
|
||||||
void resize(size_type n, char c)
|
|
||||||
{
|
|
||||||
data_.resize(n, c);
|
|
||||||
}
|
|
||||||
void reserve(size_type n)
|
|
||||||
{
|
|
||||||
data_.reserve(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
// must stay null-terminated -- the parser hands this to std::strtoull &
|
|
||||||
// friends; std::string::data() has guaranteed that since C++11
|
|
||||||
const char* data() const
|
|
||||||
{
|
|
||||||
return data_.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_back(char c)
|
|
||||||
{
|
|
||||||
data_.push_back(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
char& operator[](size_type pos)
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
char operator[](size_type pos) const
|
|
||||||
{
|
|
||||||
return data_[pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
custom_string_type& append(const char* s, size_type count)
|
|
||||||
{
|
|
||||||
data_.append(s, count);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
custom_string_type& append(const custom_string_type& other)
|
|
||||||
{
|
|
||||||
data_.append(other.data_);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_type find_first_of(char c, size_type pos = 0) const
|
|
||||||
{
|
|
||||||
return data_.find_first_of(c, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator begin()
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
iterator end()
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
const_iterator begin() const
|
|
||||||
{
|
|
||||||
return data_.begin();
|
|
||||||
}
|
|
||||||
const_iterator end() const
|
|
||||||
{
|
|
||||||
return data_.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
friend bool operator==(const custom_string_type& lhs, const custom_string_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ == rhs.data_;
|
|
||||||
}
|
|
||||||
friend bool operator<(const custom_string_type& lhs, const custom_string_type& rhs)
|
|
||||||
{
|
|
||||||
return lhs.data_ < rhs.data_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// not required by the library itself, but dump() returns a custom_string_type
|
|
||||||
// and this makes `std::cout << j.dump()` work as expected
|
|
||||||
friend std::ostream& operator<<(std::ostream& os, const custom_string_type& s)
|
|
||||||
{
|
|
||||||
return os << s.data_;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"happy": true,
|
|
||||||
"list": [
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
3
|
|
||||||
],
|
|
||||||
"pi": 3.141
|
|
||||||
}
|
|
||||||
true
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
#include <iomanip>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
@@ -22,12 +21,4 @@ int main()
|
|||||||
<< "\nstring with ignored invalid characters: "
|
<< "\nstring with ignored invalid characters: "
|
||||||
<< j_invalid.dump(-1, ' ', false, json::error_handler_t::ignore)
|
<< j_invalid.dump(-1, ' ', false, json::error_handler_t::ignore)
|
||||||
<< '\n';
|
<< '\n';
|
||||||
|
|
||||||
// the invalid byte is kept; print the result byte-wise to make it visible
|
|
||||||
std::cout << "string with kept invalid characters:";
|
|
||||||
for (const unsigned char c : j_invalid.dump(-1, ' ', false, json::error_handler_t::keep))
|
|
||||||
{
|
|
||||||
std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(c);
|
|
||||||
}
|
|
||||||
std::cout << '\n';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9
|
[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9
|
||||||
string with replaced invalid characters: "ä�ü"
|
string with replaced invalid characters: "ä�ü"
|
||||||
string with ignored invalid characters: "äü"
|
string with ignored invalid characters: "äü"
|
||||||
string with kept invalid characters: 22 c3 a4 a9 c3 bc 22
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
Hello, world!
|
Hello, world!
|
||||||
1 2 3 4 5
|
1 2 3 4 5
|
||||||
|
|
||||||
|
string: "Hello, world!"
|
||||||
number: {"floating-point":17.23,"integer":42}
|
number: {"floating-point":17.23,"integer":42}
|
||||||
null: null
|
null: null
|
||||||
string: "Hello, world!"
|
|
||||||
boolean: true
|
boolean: true
|
||||||
array: [1,2,3,4,5]
|
array: [1,2,3,4,5]
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
Hello, world!
|
Hello, world!
|
||||||
1 2 3 4 5
|
1 2 3 4 5
|
||||||
|
|
||||||
|
string: "Hello, world!"
|
||||||
number: {"floating-point":17.23,"integer":42}
|
number: {"floating-point":17.23,"integer":42}
|
||||||
null: null
|
null: null
|
||||||
string: "Hello, world!"
|
|
||||||
boolean: true
|
boolean: true
|
||||||
array: [1,2,3,4,5]
|
array: [1,2,3,4,5]
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
Hello, world!
|
Hello, world!
|
||||||
1 2 3 4 5
|
1 2 3 4 5
|
||||||
|
|
||||||
|
string: "Hello, world!"
|
||||||
number: {"floating-point":17.23,"integer":42}
|
number: {"floating-point":17.23,"integer":42}
|
||||||
null: null
|
null: null
|
||||||
string: "Hello, world!"
|
|
||||||
boolean: true
|
boolean: true
|
||||||
array: [1,2,3,4,5]
|
array: [1,2,3,4,5]
|
||||||
[json.exception.type_error.302] type must be boolean, but is string
|
[json.exception.type_error.302] type must be boolean, but is string
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ int main()
|
|||||||
auto text = R"({"IDs": [116, 943], "Width": 800})";
|
auto text = R"({"IDs": [116, 943], "Width": 800})";
|
||||||
|
|
||||||
// discard the array when the parser reads its opening bracket
|
// discard the array when the parser reads its opening bracket
|
||||||
json j_array_start = json::parse(text, [](int /*depth*/, json::parse_event_t event, json& /*parsed*/)
|
json j_array_start = json::parse(text, [](int /*depth*/, json::parse_event_t event, json & /*parsed*/)
|
||||||
{
|
{
|
||||||
return event != json::parse_event_t::array_start;
|
return event != json::parse_event_t::array_start;
|
||||||
});
|
});
|
||||||
|
|
||||||
// discard the same array when the parser reads its closing bracket
|
// discard the same array when the parser reads its closing bracket
|
||||||
json j_array_end = json::parse(text, [](int /*depth*/, json::parse_event_t event, json& /*parsed*/)
|
json j_array_end = json::parse(text, [](int /*depth*/, json::parse_event_t event, json & /*parsed*/)
|
||||||
{
|
{
|
||||||
return event != json::parse_event_t::array_end;
|
return event != json::parse_event_t::array_end;
|
||||||
});
|
});
|
||||||
@@ -33,7 +33,7 @@ int main()
|
|||||||
});
|
});
|
||||||
|
|
||||||
// discard the top-level object
|
// discard the top-level object
|
||||||
json j_root = json::parse(text, [](int /*depth*/, json::parse_event_t event, json& /*parsed*/)
|
json j_root = json::parse(text, [](int /*depth*/, json::parse_event_t event, json & /*parsed*/)
|
||||||
{
|
{
|
||||||
return event != json::parse_event_t::object_end;
|
return event != json::parse_event_t::object_end;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -215,24 +215,6 @@ For _derived_ classes and structs, use the following macros
|
|||||||
nlohmann::ordered_json j = p; // keys appear in declaration order: name, address, age
|
nlohmann::ordered_json j = p; // keys appear in declaration order: name, address, age
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note "Zero-member types"
|
|
||||||
|
|
||||||
All 12 `NLOHMANN_DEFINE_TYPE_*`/`NLOHMANN_DEFINE_DERIVED_TYPE_*` macros (excluding the `WITH_NAMES` variants)
|
|
||||||
also accept types with no member variables to serialize, producing/accepting an empty JSON object `{}`
|
|
||||||
(or, for the derived-type macros, just the base class's own JSON representation):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
namespace ns {
|
|
||||||
struct marker {
|
|
||||||
bool operator==(const marker&) const { return true; }
|
|
||||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE(marker)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
ns::marker m{};
|
|
||||||
nlohmann::json j = m; // {}
|
|
||||||
```
|
|
||||||
|
|
||||||
!!! note "No macro for non-default-constructible types"
|
!!! note "No macro for non-default-constructible types"
|
||||||
|
|
||||||
There is currently no `NLOHMANN_DEFINE_TYPE_*`-style macro for types that are not
|
There is currently no `NLOHMANN_DEFINE_TYPE_*`-style macro for types that are not
|
||||||
|
|||||||
@@ -116,22 +116,17 @@ The library uses the following mapping from JSON values types to BJData types ac
|
|||||||
```
|
```
|
||||||
|
|
||||||
Likewise, when a JSON object in the above form is serialized using
|
Likewise, when a JSON object in the above form is serialized using
|
||||||
[`to_bjdata`](../../api/basic_json/to_bjdata.md), it is automatically converted into a compact BJData ND-array.
|
[`to_bjdata`](../../api/basic_json/to_bjdata.md), it is automatically converted into a compact BJData ND-array. When
|
||||||
|
the 1-dimensional vector stored in `"_ArraySize_"` contains a single integer or two integers with one being 1, a
|
||||||
|
regular 1-D optimized array is generated instead.
|
||||||
|
|
||||||
When parsing, an ND-array whose dimension vector is empty, contains a single integer, contains two integers with the
|
An object is only converted if the annotation actually describes a packed array; otherwise it is serialized as a
|
||||||
first being 1, or contains a 0 is returned as a regular (possibly empty) array rather than an annotated object.
|
regular JSON object. This requires all of the following:
|
||||||
|
|
||||||
An object is only converted if the annotation describes a packed array that is parsed back into the same annotated
|
|
||||||
object; otherwise it is serialized as a regular JSON object, so the annotation is never lost in a round trip. This requires
|
|
||||||
all of the following:
|
|
||||||
|
|
||||||
- `"_ArrayType_"` is one of `uint8`, `int8`, `uint16`, `int16`, `uint32`, `int32`, `uint64`, `int64`, `single`,
|
- `"_ArrayType_"` is one of `uint8`, `int8`, `uint16`, `int16`, `uint32`, `int32`, `uint64`, `int64`, `single`,
|
||||||
`double`, `char`, or `byte`,
|
`double`, `char`, or `byte`,
|
||||||
- `"_ArraySize_"` is an array, since the dimensions are written as the ND-array header's length,
|
- every entry of `"_ArraySize_"` is a non-negative integer, and their product is representable as a `std::size_t`,
|
||||||
- `"_ArraySize_"` has at least two entries and is not a 1×N row vector (first entry 1), since other shapes are
|
- `"_ArrayData_"` holds exactly that many elements, and
|
||||||
parsed back as a regular array,
|
|
||||||
- every entry of `"_ArraySize_"` is a positive integer, and their product is representable as a `std::size_t`,
|
|
||||||
- `"_ArrayData_"` is an array holding exactly that many elements, and
|
|
||||||
- every element of `"_ArrayData_"` is a number of the kind named by `"_ArrayType_"` (a floating-point number for
|
- every element of `"_ArrayData_"` is a number of the kind named by `"_ArrayType_"` (a floating-point number for
|
||||||
`single` and `double`, an integer otherwise).
|
`single` and `double`, an integer otherwise).
|
||||||
|
|
||||||
@@ -208,16 +203,6 @@ The library maps BJData types to JSON value types as follows:
|
|||||||
|
|
||||||
The mapping is **complete** in the sense that any BJData value can be converted to a JSON value.
|
The mapping is **complete** in the sense that any BJData value can be converted to a JSON value.
|
||||||
|
|
||||||
!!! info "Round trips"
|
|
||||||
|
|
||||||
A value returned by [`from_bjdata`](../../api/basic_json/from_bjdata.md) can be serialized with
|
|
||||||
[`to_bjdata`](../../api/basic_json/to_bjdata.md) using any combination of options and parsed back into an equal
|
|
||||||
value, and serializing that value again with the same options produces the same bytes. The exception is binary
|
|
||||||
values: they are only written as an optimized binary array (`[$B`) if Draft 3 is enabled and both `use_size` and
|
|
||||||
`use_type` are set. Otherwise, they are written as arrays of integers and parsed back as such (see the notes on
|
|
||||||
binary values above), and serializing such an array again may choose different, but equally valid, type markers.
|
|
||||||
The bytes can then differ, but parsing them again yields the same value.
|
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
|||||||
@@ -98,26 +98,6 @@ The library maps BSON record types to JSON value types as follows:
|
|||||||
This library deserializes BSON type `0x11` (Timestamp) as a `number_unsigned` value. The 64-bit value is preserved,
|
This library deserializes BSON type `0x11` (Timestamp) as a `number_unsigned` value. The 64-bit value is preserved,
|
||||||
but the Timestamp type information is not.
|
but the Timestamp type information is not.
|
||||||
|
|
||||||
!!! warning "Lenient BSON input handling"
|
|
||||||
|
|
||||||
The BSON reader is lenient in a few areas where the BSON specification is more restrictive:
|
|
||||||
|
|
||||||
- array element keys are not checked against the required decimal sequence (`0`, `1`, `2`, ...),
|
|
||||||
- any non-zero byte is accepted as `true` for the boolean type, and
|
|
||||||
- the payload for binary subtype `0x02` is returned as-is, including its inner length prefix.
|
|
||||||
|
|
||||||
If BSON input must be validated for strict specification compliance, validate it separately before passing it to
|
|
||||||
`from_bson()`.
|
|
||||||
|
|
||||||
!!! warning "UTF-8 validation of string values"
|
|
||||||
|
|
||||||
The BSON specification requires `string` values (type `0x02`) to be valid UTF-8. This library validates the
|
|
||||||
bytes of every such string at decode time and rejects ill-formed UTF-8 with a
|
|
||||||
[`parse_error.113`](../../home/exceptions.md#jsonexceptionparse_error113) exception (or, with `allow_exceptions`
|
|
||||||
set to `false`, a discarded value), rather than only failing later when the resulting value is dumped. Element
|
|
||||||
(key) names and `binary` values (type `0x05`) are unaffected and are never validated, since they are read
|
|
||||||
byte-by-byte as a C string, or are not required to hold text, respectively.
|
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
|||||||
@@ -176,16 +176,6 @@ The library maps CBOR types to JSON value types as follows:
|
|||||||
|
|
||||||
CBOR allows map keys of any type, whereas JSON only allows strings as keys in object values. Therefore, CBOR maps with keys other than UTF-8 strings are rejected.
|
CBOR allows map keys of any type, whereas JSON only allows strings as keys in object values. Therefore, CBOR maps with keys other than UTF-8 strings are rejected.
|
||||||
|
|
||||||
!!! warning "UTF-8 validation of text strings"
|
|
||||||
|
|
||||||
[RFC 8949, Section 3.1](https://www.rfc-editor.org/rfc/rfc8949.html#section-3.1) requires CBOR text strings
|
|
||||||
(major type 3) to be valid UTF-8. This library validates the bytes of every text string (object keys included) at
|
|
||||||
decode time and rejects ill-formed UTF-8 with a
|
|
||||||
[`parse_error.113`](../../home/exceptions.md#jsonexceptionparse_error113) exception (or, with
|
|
||||||
`allow_exceptions` set to `false`, a discarded value), rather than only failing later when the resulting value is
|
|
||||||
dumped. Byte strings (major type 2) are unaffected and are never validated, since they are not required to hold
|
|
||||||
text.
|
|
||||||
|
|
||||||
!!! warning "Tagged items"
|
!!! warning "Tagged items"
|
||||||
|
|
||||||
Tagged items (0xC0..0xDB) will throw a parse error by default. They can be ignored by passing `cbor_tag_handler_t::ignore` to function `from_cbor`, in which case the tag is skipped and the enclosed data item is parsed on its own. They can be stored by passing `cbor_tag_handler_t::store` to function `from_cbor`. Note that no tag is ever interpreted: for instance, a text string tagged with tag 0 (date/time) stays a string.
|
Tagged items (0xC0..0xDB) will throw a parse error by default. They can be ignored by passing `cbor_tag_handler_t::ignore` to function `from_cbor`, in which case the tag is skipped and the enclosed data item is parsed on its own. They can be stored by passing `cbor_tag_handler_t::store` to function `from_cbor`. Note that no tag is ever interpreted: for instance, a text string tagged with tag 0 (date/time) stays a string.
|
||||||
|
|||||||
@@ -136,14 +136,6 @@ The library maps MessagePack types to JSON value types as follows:
|
|||||||
|
|
||||||
Any MessagePack output created by `to_msgpack` can be successfully parsed by `from_msgpack`.
|
Any MessagePack output created by `to_msgpack` can be successfully parsed by `from_msgpack`.
|
||||||
|
|
||||||
!!! warning "UTF-8 validation of string values"
|
|
||||||
|
|
||||||
The MessagePack specification requires `str` values (`fixstr`, `str 8`, `str 16`, `str 32`) to be valid UTF-8.
|
|
||||||
This library validates the bytes of every such string (object keys included) at decode time and rejects
|
|
||||||
ill-formed UTF-8 with a [`parse_error.113`](../../home/exceptions.md#jsonexceptionparse_error113) exception (or,
|
|
||||||
with `allow_exceptions` set to `false`, a discarded value), rather than only failing later when the resulting
|
|
||||||
value is dumped. `bin`/`ext`/`fixext` values are unaffected and are never validated, since they are not required
|
|
||||||
to hold text.
|
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
|
|
||||||
|
|||||||
@@ -69,13 +69,6 @@ The library uses the following mapping from JSON values types to UBJSON types ac
|
|||||||
Note that `use_size = true` alone may result in larger representations - the benefit of this parameter is that the
|
Note that `use_size = true` alone may result in larger representations - the benefit of this parameter is that the
|
||||||
receiving side is immediately informed on the number of elements of the container.
|
receiving side is immediately informed on the number of elements of the container.
|
||||||
|
|
||||||
An array whose type marker is `Z` (null), `T` (true) or `F` (false) stores no payload at all, because the marker
|
|
||||||
already is the value. Its declared count is therefore the only thing that decides how much memory the receiving side
|
|
||||||
allocates, and a handful of bytes can describe billions of elements. `from_ubjson` rejects such an array with
|
|
||||||
[`out_of_range.408`](../../home/exceptions.md#jsonexceptionout_of_range408) when the count exceeds 1,048,576
|
|
||||||
(`1 << 20`), and `to_ubjson` writes longer arrays of these types without the annotation, so any value it produces
|
|
||||||
can be read back.
|
|
||||||
|
|
||||||
!!! info "Binary values"
|
!!! info "Binary values"
|
||||||
|
|
||||||
If the JSON data contains the binary type, the value stored is a list of integers, as suggested by the UBJSON
|
If the JSON data contains the binary type, the value stored is a list of integers, as suggested by the UBJSON
|
||||||
|
|||||||
@@ -54,30 +54,6 @@ json j = {1.0, "hello", 42};
|
|||||||
auto t = j.get<std::tuple<double, std::string, int>>(); // {1.0, "hello", 42}
|
auto t = j.get<std::tuple<double, std::string, int>>(); // {1.0, "hello", 42}
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! warning "Serializing a `std::pair`/`std::tuple` whose every element is a string-keyed pair"
|
|
||||||
|
|
||||||
When *every* element of a `#!cpp std::pair` or `#!cpp std::tuple` is itself a two-element array whose first
|
|
||||||
element is a string (for example `#!cpp std::pair<std::string, int>`), serializing it produces a JSON **object**
|
|
||||||
instead of the expected array:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
using kv = std::pair<std::string, int>;
|
|
||||||
json j = std::pair<kv, kv>{{"a", 1}, {"b", 2}}; // {"a":1,"b":2}, not [["a",1],["b",2]]
|
|
||||||
```
|
|
||||||
|
|
||||||
This is a consequence of the [brace-initializer object-detection rule](creating_values.md): the same rule that
|
|
||||||
lets `#!cpp json{{"a", 1}, {"b", 2}}` create an object also fires here. The resulting object cannot be read back
|
|
||||||
into the original type (`#!cpp get<std::pair<kv, kv>>()` throws [`type_error.302`](../home/exceptions.md#jsonexceptiontype_error302)),
|
|
||||||
and duplicate keys collapse into one, losing elements. This only affects `#!cpp std::pair`/`#!cpp std::tuple`
|
|
||||||
themselves; a `#!cpp std::vector<std::pair<std::string, int>>`, or a pair/tuple with at least one element that is
|
|
||||||
not a string-keyed pair, serializes to an array as expected. To force an array, build one explicitly from the
|
|
||||||
elements with [`array`](../api/basic_json/array.md):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
std::pair<kv, kv> p{{"a", 1}, {"b", 2}};
|
|
||||||
json a = json::array({p.first, p.second}); // [["a",1],["b",2]]
|
|
||||||
```
|
|
||||||
|
|
||||||
!!! info "Extracting references into a tuple"
|
!!! info "Extracting references into a tuple"
|
||||||
|
|
||||||
A tuple type may also hold references (e.g. `#!cpp std::tuple<double&, std::string&>`) to avoid copying: `get`
|
A tuple type may also hold references (e.g. `#!cpp std::tuple<double&, std::string&>`) to avoid copying: `get`
|
||||||
|
|||||||
@@ -91,23 +91,6 @@ security reasons (e.g., Intel Software Guard Extensions (SGX)).
|
|||||||
|
|
||||||
See [full documentation of `JSON_NO_IO`](../api/macros/json_no_io.md).
|
See [full documentation of `JSON_NO_IO`](../api/macros/json_no_io.md).
|
||||||
|
|
||||||
## `JSON_NO_THREAD_LOCAL`
|
|
||||||
|
|
||||||
When defined, the library does not use `#!cpp thread_local` storage. Copying a value and comparing two values then
|
|
||||||
always avoid the call stack rather than descending into a bounded number of levels first, which is slower but yields the
|
|
||||||
same values and the same comparisons.
|
|
||||||
|
|
||||||
See [full documentation of `JSON_NO_THREAD_LOCAL`](../api/macros/json_no_thread_local.md).
|
|
||||||
|
|
||||||
## `JSON_PRECISE_STREAM_POSITION`
|
|
||||||
|
|
||||||
When defined to `1`, [`operator>>`](../api/operator_gtgt.md) and non-strict
|
|
||||||
[`sax_parse`](../api/basic_json/sax_parse.md) leave an input stream positioned right after the parsed value, instead of
|
|
||||||
also consuming the character that terminates a number. The default value is `0`, which preserves the existing behavior;
|
|
||||||
this is planned to become the default in version 4.0.0.
|
|
||||||
|
|
||||||
See [full documentation of `JSON_PRECISE_STREAM_POSITION`](../api/macros/json_precise_stream_position.md).
|
|
||||||
|
|
||||||
## `JSON_SKIP_LIBRARY_VERSION_CHECK`
|
## `JSON_SKIP_LIBRARY_VERSION_CHECK`
|
||||||
|
|
||||||
When defined, the library will not create a compiler warning when a different version of the library was already
|
When defined, the library will not create a compiler warning when a different version of the library was already
|
||||||
@@ -122,19 +105,6 @@ using the library with compilers that do not fully support C++11 and may only wo
|
|||||||
|
|
||||||
See [full documentation of `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`](../api/macros/json_skip_unsupported_compiler_check.md).
|
See [full documentation of `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`](../api/macros/json_skip_unsupported_compiler_check.md).
|
||||||
|
|
||||||
## `JSON_STRICT_NUL_HANDLING`
|
|
||||||
|
|
||||||
When defined to `1`, a `'\0'` (NUL) byte anywhere in the input is rejected with `parse_error.101`, like any other
|
|
||||||
unexpected byte, instead of being silently treated as end of input (see the
|
|
||||||
[FAQ entry](../home/faq.md#nul-bytes-in-the-input) for background). The default value is `0`, which preserves the
|
|
||||||
existing behavior; this is planned to become the default in version 4.0.0.
|
|
||||||
|
|
||||||
The strict handling can also be enabled with the CMake option
|
|
||||||
[`JSON_StrictNulHandling`](../integration/cmake.md#json_strictnulhandling) (`OFF` by default) which sets
|
|
||||||
`JSON_STRICT_NUL_HANDLING` accordingly.
|
|
||||||
|
|
||||||
See [full documentation of `JSON_STRICT_NUL_HANDLING`](../api/macros/json_strict_nul_handling.md).
|
|
||||||
|
|
||||||
## `JSON_THROW_USER(exception)`
|
## `JSON_THROW_USER(exception)`
|
||||||
|
|
||||||
This macro overrides `#!cpp throw` calls inside the library. The argument is the exception to be thrown.
|
This macro overrides `#!cpp throw` calls inside the library. The argument is the exception to be thrown.
|
||||||
@@ -167,14 +137,6 @@ behavior is deprecated and switched off (`0`) by default.
|
|||||||
|
|
||||||
See [full documentation of `JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`](../api/macros/json_use_legacy_discarded_value_comparison.md).
|
See [full documentation of `JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`](../api/macros/json_use_legacy_discarded_value_comparison.md).
|
||||||
|
|
||||||
## `JSON_USE_SIMDUTF`
|
|
||||||
|
|
||||||
When defined, UTF-8 validation of JSON strings read from contiguous byte input is delegated to the
|
|
||||||
[simdutf](https://github.com/simdutf/simdutf) library instead of the built-in scalar validator. This is an opt-in
|
|
||||||
external dependency and is not defined by default.
|
|
||||||
|
|
||||||
See [full documentation of `JSON_USE_SIMDUTF`](../api/macros/json_use_simdutf.md).
|
|
||||||
|
|
||||||
## `NLOHMANN_DEFINE_TYPE_*(...)`, `NLOHMANN_DEFINE_DERIVED_TYPE_*(...)`
|
## `NLOHMANN_DEFINE_TYPE_*(...)`, `NLOHMANN_DEFINE_DERIVED_TYPE_*(...)`
|
||||||
|
|
||||||
The library defines 12 macros to simplify the serialization/deserialization of types. See the page on
|
The library defines 12 macros to simplify the serialization/deserialization of types. See the page on
|
||||||
|
|||||||
@@ -15,11 +15,6 @@ The complete default namespace name is derived as follows:
|
|||||||
- [`JSON_DIAGNOSTICS`](../api/macros/json_diagnostics.md) defined non-zero appends `_diag`.
|
- [`JSON_DIAGNOSTICS`](../api/macros/json_diagnostics.md) defined non-zero appends `_diag`.
|
||||||
- [`JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`](../api/macros/json_use_legacy_discarded_value_comparison.md)
|
- [`JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`](../api/macros/json_use_legacy_discarded_value_comparison.md)
|
||||||
defined non-zero appends `_ldvcmp`.
|
defined non-zero appends `_ldvcmp`.
|
||||||
- [`JSON_DIAGNOSTIC_POSITIONS`](../api/macros/json_diagnostic_positions.md) defined non-zero appends `_dp`.
|
|
||||||
- [`JSON_BRACE_INIT_COPY_SEMANTICS`](../api/macros/json_brace_init_copy_semantics.md) defined non-zero appends
|
|
||||||
`_bics`.
|
|
||||||
- [`JSON_PRECISE_STREAM_POSITION`](../api/macros/json_precise_stream_position.md) defined non-zero appends `_psp`.
|
|
||||||
- [`JSON_STRICT_NUL_HANDLING`](../api/macros/json_strict_nul_handling.md) defined non-zero appends `_snul`.
|
|
||||||
- The inline namespace ends with the suffix `_v` followed by the 3 components of the version number separated by
|
- The inline namespace ends with the suffix `_v` followed by the 3 components of the version number separated by
|
||||||
underscores. To omit the version component, see [Disabling the version component](#disabling-the-version-component)
|
underscores. To omit the version component, see [Disabling the version component](#disabling-the-version-component)
|
||||||
below.
|
below.
|
||||||
|
|||||||
@@ -51,11 +51,7 @@ If you do want to preserve the **insertion order**, you can use the type [`nlohm
|
|||||||
--8<-- "examples/ordered_json.output"
|
--8<-- "examples/ordered_json.output"
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, [`nlohmann::fifo_map`](https://github.com/nlohmann/fifo_map) also preserves the insertion order and, unlike [`ordered_map`](../api/ordered_map.md), keeps a lookup index, so it does not have the quadratic cost described below. It is used through a small adapter ([integration](https://github.com/nlohmann/json/issues/485#issuecomment-333652309)).
|
Alternatively, you can use a more sophisticated ordered map like [`tsl::ordered_map`](https://github.com/Tessil/ordered-map) ([integration](https://github.com/nlohmann/json/issues/546#issuecomment-304447518)) or [`nlohmann::fifo_map`](https://github.com/nlohmann/fifo_map) ([integration](https://github.com/nlohmann/json/issues/485#issuecomment-333652309)).
|
||||||
|
|
||||||
If the order does not matter and you only want faster lookup, `boost::unordered_flat_map`, `absl::flat_hash_map`, `absl::node_hash_map`, and several other hash maps work through an adapter that restores the template argument order `basic_json` expects; see [Template Parameter Requirements](types/template_parameters.md#objecttype). Note these are *unordered*, not insertion-ordered.
|
|
||||||
|
|
||||||
[`tsl::ordered_map`](https://github.com/Tessil/ordered-map) cannot be used: its iterators expose the mapped value as `const`, while `basic_json` needs to modify it in place.
|
|
||||||
|
|
||||||
The [`ordered_map`](../api/ordered_map.md) behind `nlohmann::ordered_json` is deliberately minimal and has no lookup
|
The [`ordered_map`](../api/ordered_map.md) behind `nlohmann::ordered_json` is deliberately minimal and has no lookup
|
||||||
index, so every key access is a linear scan and building an object of `n` keys costs O(n²). This is unnoticeable at
|
index, so every key access is a linear scan and building an object of `n` keys costs O(n²). This is unnoticeable at
|
||||||
|
|||||||
@@ -40,9 +40,7 @@ what makes it possible to read several concatenated values from the same stream,
|
|||||||
document followed by trailing bytes" is accepted rather than rejected. If you are validating conformance, or need to
|
document followed by trailing bytes" is accepted rather than rejected. If you are validating conformance, or need to
|
||||||
reject any input that is not exactly one JSON document, prefer `parse`.
|
reject any input that is not exactly one JSON document, prefer `parse`.
|
||||||
|
|
||||||
When using `operator>>` to read several concatenated values this way, a value that is a number must be followed by
|
Values read this way do not need to be separated by whitespace; see the
|
||||||
whitespace, because `operator>>` consumes the character that terminates a number, unless
|
|
||||||
[`JSON_PRECISE_STREAM_POSITION`](../../api/macros/json_precise_stream_position.md) is defined to `1` — see the
|
|
||||||
[`operator>>` notes](../../api/operator_gtgt.md#notes) for details and examples.
|
[`operator>>` notes](../../api/operator_gtgt.md#notes) for details and examples.
|
||||||
|
|
||||||
## SAX vs. DOM parsing
|
## SAX vs. DOM parsing
|
||||||
|
|||||||
@@ -49,5 +49,4 @@ JSON Lines input with more than one value is treated as invalid JSON by the [`pa
|
|||||||
with a JSON Lines input does not work, because the parser will try to parse one value after the last one.
|
with a JSON Lines input does not work, because the parser will try to parse one value after the last one.
|
||||||
|
|
||||||
This is different from parsing a stream of *concatenated* (non-newline-delimited) JSON values, for which
|
This is different from parsing a stream of *concatenated* (non-newline-delimited) JSON values, for which
|
||||||
`operator>>` does work, provided that a value that is a number is followed by whitespace -- see its
|
`operator>>` does work -- see its [notes](../../api/operator_gtgt.md#notes) for details.
|
||||||
[notes](../../api/operator_gtgt.md#notes) for details.
|
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ serialization fails by default. The fourth argument of `dump` selects an
|
|||||||
- `strict` (default) — throw a [`type_error.316`](../home/exceptions.md#jsonexceptiontype_error316) exception.
|
- `strict` (default) — throw a [`type_error.316`](../home/exceptions.md#jsonexceptiontype_error316) exception.
|
||||||
- `replace` — replace invalid bytes with the Unicode replacement character U+FFFD (`�`).
|
- `replace` — replace invalid bytes with the Unicode replacement character U+FFFD (`�`).
|
||||||
- `ignore` — silently drop invalid bytes.
|
- `ignore` — silently drop invalid bytes.
|
||||||
- `keep` — copy invalid bytes to the output unchanged; the result is not valid UTF-8.
|
|
||||||
|
|
||||||
??? example
|
??? example
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user