Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix and extend documentation of discarded values #2363

Merged
merged 2 commits into from
Aug 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions doc/examples/parse__allow_exceptions.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main()
{
// an invalid JSON text
std::string text = R"(
{
"key": "value without closing quotes
}
)";

// parse with exceptions
try
{
json j = json::parse(text);
}
catch (json::parse_error& e)
{
std::cout << e.what() << std::endl;
}

// parse without exceptions
json j = json::parse(text, nullptr, false);

if (j.is_discarded())
{
std::cout << "the input is invalid JSON" << std::endl;
}
else
{
std::cout << "the input is valid JSON: " << j << std::endl;
}
}
1 change: 1 addition & 0 deletions doc/examples/parse__allow_exceptions.link
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<a target="_blank" href="https://wandbox.org/permlink/2TsG4VSg87HsRQC9"><b>online</b></a>
2 changes: 2 additions & 0 deletions doc/examples/parse__allow_exceptions.output
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[json.exception.parse_error.101] parse error at line 4, column 0: syntax error while parsing value - invalid string: control character U+000A (LF) must be escaped to \u000A or \n; last read: '"value without closing quotes<U+000A>'
the input is invalid JSON
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/exception.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::exception
# basic_json::exception

```cpp
class exception : public std::exception;
Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/from_bson.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Deserializes a given input to a JSON value using the BSON (Binary JSON) serializ
## Return value

deserialized JSON value; in case of a parse error and `allow_exceptions` set to `#!cpp false`, the return value will be
`value_t::discarded`.
`value_t::discarded`. The latter can be checked with [`is_discarded`](is_discarded.md).

## Exception safety

Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/from_cbor.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Deserializes a given input to a JSON value using the CBOR (Concise Binary Object
## Return value

deserialized JSON value; in case of a parse error and `allow_exceptions` set to `#!cpp false`, the return value will be
`value_t::discarded`.
`value_t::discarded`. The latter can be checked with [`is_discarded`](is_discarded.md).

## Exception safety

Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/from_msgpack.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Deserializes a given input to a JSON value using the MessagePack serialization f
## Return value

deserialized JSON value; in case of a parse error and `allow_exceptions` set to `#!cpp false`, the return value will be
`value_t::discarded`.
`value_t::discarded`. The latter can be checked with [`is_discarded`](is_discarded.md).

## Exception safety

Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/from_ubjson.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Deserializes a given input to a JSON value using the UBJSON (Universal Binary JS
## Return value

deserialized JSON value; in case of a parse error and `allow_exceptions` set to `#!cpp false`, the return value will be
`value_t::discarded`.
`value_t::discarded`. The latter can be checked with [`is_discarded`](is_discarded.md).

## Exception safety

Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/invalid_iterator.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::invalid_iterator
# basic_json::invalid_iterator

```cpp
class invalid_iterator : public exception;
Expand Down
33 changes: 30 additions & 3 deletions doc/mkdocs/docs/api/basic_json/is_discarded.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
constexpr bool is_discarded() const noexcept;
```

This function returns true if and only if the JSON value was discarded during parsing with a callback function (see
[`parser_callback_t`](parser_callback_t.md)).

This function returns `#!cpp true` for a JSON value if either:

- the value was discarded during parsing with a callback function (see [`parser_callback_t`](parser_callback_t.md)), or
- the value is the result of parsing invalid JSON with parameter `allow_exceptions` set to `#!cpp false`; see
[`parse`](parse.md) for more information.

## Return value

`#!cpp true` if type is discarded, `#!cpp false` otherwise.
Expand All @@ -21,6 +24,30 @@ Constant.

## Notes

!!! note

Discarded values are never compared equal with [`operator==`](operator_eq.md). That is, checking whether a JSON
value `j` is discarded will only work via:

```cpp
j.is_discarded()
```

because

```cpp
j == json::value_t::discarded
```

will always be `#!cpp false`.

!!! note

When a value is discarded by a callback function (see [`parser_callback_t`](parser_callback_t.md)) during parsing,
then it is removed when it is part of a structured value. For instance, if the second value of an array is discared,
instead of `#!json [null, discarded, false]`, the array `#!json [null, false]` is returned. Only if the top-level
value is discarded, the return value of the `parse` call is discarded.

This function will always be `#!cpp false` for JSON values after parsing. That is, discarded values can only occur
during parsing, but will be removed when inside a structured value or replaced by null in other cases.

Expand Down
23 changes: 14 additions & 9 deletions doc/mkdocs/docs/api/basic_json/operator_eq.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@ bool operator==(ScalarType lhs, const const_reference rhs) noexcept;

Compares two JSON values for equality according to the following rules:

- Two JSON values are equal if (1) they are from the same type and (2) their stored values are the same according to
their respective `operator==`.
- Two JSON values are equal if (1) they are not discarded, (2) they are from the same type, and (3) their stored values
are the same according to their respective `operator==`.
- Integer and floating-point numbers are automatically converted before comparison. Note that two NaN values are always
treated as unequal.
- Two JSON null values are equal.

## Template parameters

Expand Down Expand Up @@ -45,11 +44,19 @@ Linear.

## Notes

- Floating-point inside JSON values numbers are compared with `json::number_float_t::operator==` which is
`double::operator==` by default. To compare floating-point while respecting an epsilon, an alternative
[comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39)
could be used, for instance
!!! note

- NaN values never compare equal to themselves or to other NaN values.
- JSON `#!cpp null` values are all equal.
- Discarded values never compare equal to themselves.

!!! note

Floating-point numbers inside JSON values numbers are compared with `json::number_float_t::operator==` which is
`double::operator==` by default. To compare floating-point while respecting an epsilon, an alternative
[comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39)
could be used, for instance

```cpp
template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value, T>::type>
inline bool is_same(T a, T b, T epsilon = std::numeric_limits<T>::epsilon()) noexcept
Expand Down Expand Up @@ -78,8 +85,6 @@ Linear.
}
```

- NaN values never compare equal to themselves or to other NaN values.

## Example

??? example
Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/other_error.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::other_error
# basic_json::other_error

```cpp
class other_error : public exception;
Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/out_of_range.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::out_of_range
# basic_json::out_of_range

```cpp
class out_of_range : public exception;
Expand Down
24 changes: 19 additions & 5 deletions doc/mkdocs/docs/api/basic_json/parse.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ static basic_json parse(IteratorType first, IteratorType last,
## Return value

Deserialized JSON value; in case of a parse error and `allow_exceptions` set to `#!cpp false`, the return value will be
`value_t::discarded`.
`value_t::discarded`. The latter can be checked with [`is_discarded`](is_discarded.md).

## Exception safety

Expand All @@ -79,7 +79,7 @@ super-linear complexity.

## Examples

??? example
??? example "Parsing from a charater array"

The example below demonstrates the `parse()` function reading from an array.

Expand All @@ -93,7 +93,7 @@ super-linear complexity.
--8<-- "examples/parse__array__parser_callback_t.output"
```

??? example
??? example "Parsing from a string"

The example below demonstrates the `parse()` function with and without callback function.

Expand All @@ -107,7 +107,7 @@ super-linear complexity.
--8<-- "examples/parse__string__parser_callback_t.output"
```

??? example
??? example "Parsing from an input stream"

The example below demonstrates the `parse()` function with and without callback function.

Expand All @@ -121,7 +121,7 @@ super-linear complexity.
--8<-- "examples/parse__istream__parser_callback_t.output"
```

??? example
??? example "Parsing from a contiguous container"

The example below demonstrates the `parse()` function reading from a contiguous container.

Expand All @@ -135,6 +135,20 @@ super-linear complexity.
--8<-- "examples/parse__contiguouscontainer__parser_callback_t.output"
```

??? example "Effect of `allow_exceptions` parameter"

The example below demonstrates the effect of the `allow_exceptions` parameter in the ´parse()` function.

```cpp
--8<-- "examples/parse__allow_exceptions.cpp"
```

Output:

```json
--8<-- "examples/parse__allow_exceptions.output"
```

## Version history

- Added in version 1.0.0.
Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/parse_error.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::parse_error
# basic_json::parse_error

```cpp
class parse_error : public exception;
Expand Down
2 changes: 1 addition & 1 deletion doc/mkdocs/docs/api/basic_json/type_error.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# basic_basic_json::type_error
# basic_json::type_error

```cpp
class type_error : public exception;
Expand Down