Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
json
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
json
Commits
a048b72f
Unverified
Commit
a048b72f
authored
5 years ago
by
Niels Lohmann
Committed by
GitHub
5 years ago
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1559 from theodelrieu/feat/explicit_conversion_operator
Feat/explicit conversion operator
parents
484029b5
79732931
develop
bon8
coverity_scan
feature/optional
gcc_warning_flags
icpc
issue2615
issue2932
issue3232_use_catch
master
release/3.10.2
release/3.10.3
release/3.10.4
release/3.10.5
string_view
string_view2
update_doctest
v3.10.5
v3.10.4
v3.10.3
v3.10.2
v3.10.1
v3.10.0
v3.9.1
v3.9.0
No related merge requests found
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
191 additions
and
66 deletions
+191
-66
.travis.yml
.travis.yml
+18
-1
CMakeLists.txt
CMakeLists.txt
+7
-0
appveyor.yml
appveyor.yml
+22
-1
include/nlohmann/detail/conversions/from_json.hpp
include/nlohmann/detail/conversions/from_json.hpp
+7
-3
include/nlohmann/detail/macro_scope.hpp
include/nlohmann/detail/macro_scope.hpp
+10
-0
include/nlohmann/detail/macro_unscope.hpp
include/nlohmann/detail/macro_unscope.hpp
+1
-0
include/nlohmann/detail/meta/type_traits.hpp
include/nlohmann/detail/meta/type_traits.hpp
+10
-0
include/nlohmann/json.hpp
include/nlohmann/json.hpp
+10
-9
single_include/nlohmann/json.hpp
single_include/nlohmann/json.hpp
+38
-12
test/src/unit-cbor.cpp
test/src/unit-cbor.cpp
+10
-10
test/src/unit-constructor1.cpp
test/src/unit-constructor1.cpp
+4
-4
test/src/unit-conversions.cpp
test/src/unit-conversions.cpp
+19
-4
test/src/unit-readme.cpp
test/src/unit-readme.cpp
+5
-5
test/src/unit-regression.cpp
test/src/unit-regression.cpp
+25
-13
test/src/unit-udt.cpp
test/src/unit-udt.cpp
+2
-0
test/src/unit-udt_macro.cpp
test/src/unit-udt_macro.cpp
+2
-3
test/src/unit-unicode.cpp
test/src/unit-unicode.cpp
+1
-1
No files found.
.travis.yml
View file @
a048b72f
...
...
@@ -145,6 +145,11 @@ matrix:
-
os
:
osx
osx_image
:
xcode12
-
os
:
osx
osx_image
:
xcode12
env
:
-
IMPLICIT_CONVERSIONS=OFF
# Linux / GCC
-
os
:
linux
...
...
@@ -203,6 +208,16 @@ matrix:
sources
:
[
'
ubuntu-toolchain-r-test'
]
packages
:
[
'
g++-9'
,
'
ninja-build'
]
-
os
:
linux
compiler
:
gcc
env
:
-
COMPILER=g++-9
-
IMPLICIT_CONVERSIONS=OFF
addons
:
apt
:
sources
:
[
'
ubuntu-toolchain-r-test'
]
packages
:
[
'
g++-9'
,
'
ninja-build'
]
-
os
:
linux
compiler
:
gcc
env
:
...
...
@@ -315,10 +330,12 @@ script:
-
if [[ "${COMPILER}" != "" ]]; then export CXX=${COMPILER}; fi
# by default, use the single-header version
-
if [[ "${MULTIPLE_HEADERS}" == "" ]]; then export MULTIPLE_HEADERS=OFF; fi
# by default, use implicit conversions
-
if [[ "${IMPLICIT_CONVERSIONS}" == "" ]]; then export IMPLICIT_CONVERSIONS=ON; fi
# compile and execute unit tests
-
mkdir -p build && cd build
-
cmake .. ${CMAKE_OPTIONS} -DJSON_MultipleHeaders=${MULTIPLE_HEADERS} -DJSON_BuildTests=On -GNinja && cmake --build . --config Release
-
cmake .. ${CMAKE_OPTIONS} -DJSON_MultipleHeaders=${MULTIPLE_HEADERS} -DJSON_
ImplicitConversions=${IMPLICIT_CONVERSIONS} -DJSON_
BuildTests=On -GNinja && cmake --build . --config Release
-
ctest -C Release --timeout 2700 -V -j
-
cd ..
...
...
This diff is collapsed.
Click to expand it.
CMakeLists.txt
View file @
a048b72f
...
...
@@ -24,6 +24,7 @@ endif ()
option
(
JSON_BuildTests
"Build the unit tests when BUILD_TESTING is enabled."
ON
)
option
(
JSON_Install
"Install CMake targets during install step."
ON
)
option
(
JSON_MultipleHeaders
"Use non-amalgamated version of the library."
OFF
)
option
(
JSON_ImplicitConversions
"Enable implicit conversions"
ON
)
##
## CONFIGURATION
...
...
@@ -60,6 +61,12 @@ else()
target_compile_features
(
${
NLOHMANN_JSON_TARGET_NAME
}
INTERFACE cxx_std_11
)
endif
()
target_compile_definitions
(
${
NLOHMANN_JSON_TARGET_NAME
}
INTERFACE
JSON_USE_IMPLICIT_CONVERSIONS=$<BOOL:
${
JSON_ImplicitConversions
}
>
)
target_include_directories
(
${
NLOHMANN_JSON_TARGET_NAME
}
INTERFACE
...
...
This diff is collapsed.
Click to expand it.
appveyor.yml
View file @
a048b72f
...
...
@@ -7,6 +7,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 14
2015
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2017
...
...
@@ -14,6 +15,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 15
2017
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2019
...
...
@@ -21,6 +23,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 16
2019
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2019
...
...
@@ -28,6 +31,7 @@ environment:
platform
:
x64
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 16
2019
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2015
...
...
@@ -36,6 +40,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Ninja
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2015
...
...
@@ -44,6 +49,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Ninja
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2015
...
...
@@ -51,6 +57,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 14
2015
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2015
...
...
@@ -59,6 +66,7 @@ environment:
name
:
with_win_header
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 14
2015
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2017
...
...
@@ -66,6 +74,7 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
/permissive-
/std:c++latest
/utf-8"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 15
2017
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2019
...
...
@@ -73,6 +82,15 @@ environment:
platform
:
x86
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
-DJSON_ImplicitConversions=OFF"
GENERATOR
:
Visual Studio 16
2019
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2019
configuration
:
Release
platform
:
x64
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 16
2019
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2015
...
...
@@ -80,6 +98,7 @@ environment:
platform
:
x64
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 14
2015
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2017
...
...
@@ -87,6 +106,7 @@ environment:
platform
:
x64
CXX_FLAGS
:
"
/permissive-
/std:c++latest
/Zc:__cplusplus
/utf-8
/F4000000"
LINKER_FLAGS
:
"
/STACK:4000000"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 15
2017
-
APPVEYOR_BUILD_WORKER_IMAGE
:
Visual Studio
2019
...
...
@@ -94,6 +114,7 @@ environment:
platform
:
x64
CXX_FLAGS
:
"
"
LINKER_FLAGS
:
"
"
CMAKE_OPTIONS
:
"
"
GENERATOR
:
Visual Studio 16
2019
init
:
...
...
@@ -112,7 +133,7 @@ before_build:
# for with_win_header build, inject the inclusion of Windows.h to the single-header library
-
ps
:
if ($env:name -Eq "with_win_header") { $header_path = "single_include\nlohmann\json.hpp" }
-
ps
:
if ($env:name -Eq "with_win_header") { "#include <Windows.h>`n" + (Get-Content $header_path | Out-String) | Set-Content $header_path }
-
if "%GENERATOR%"=="Ninja" (cmake . -G "%GENERATOR%" -DCMAKE_BUILD_TYPE="%configuration%" -DCMAKE_CXX_FLAGS="%CXX_FLAGS%" -DCMAKE_EXE_LINKER_FLAGS="%LINKER_FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" -DJSON_BuildTests=On
) else (cmake . -G "%GENERATOR%" -A "%GENERATOR_PLATFORM%" -DCMAKE_CXX_FLAGS="%CXX_FLAGS%" -DCMAKE_EXE_LINKER_FLAGS="%LINKER_FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" -DJSON_BuildTests=On
)
-
if "%GENERATOR%"=="Ninja" (cmake . -G "%GENERATOR%" -DCMAKE_BUILD_TYPE="%configuration%" -DCMAKE_CXX_FLAGS="%CXX_FLAGS%" -DCMAKE_EXE_LINKER_FLAGS="%LINKER_FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" -DJSON_BuildTests=On
"%CMAKE_OPTIONS%") else (cmake . -G "%GENERATOR%" -A "%GENERATOR_PLATFORM%" -DCMAKE_CXX_FLAGS="%CXX_FLAGS%" -DCMAKE_EXE_LINKER_FLAGS="%LINKER_FLAGS%" -DCMAKE_IGNORE_PATH="C:/Program Files/Git/usr/bin" -DJSON_BuildTests=On "%CMAKE_OPTIONS%"
)
build_script
:
-
cmake --build . --config "%configuration%"
...
...
This diff is collapsed.
Click to expand it.
include/nlohmann/detail/conversions/from_json.hpp
View file @
a048b72f
...
...
@@ -128,7 +128,7 @@ void from_json(const BasicJsonType& j, EnumType& e)
// forward_list doesn't have an insert method
template
<
typename
BasicJsonType
,
typename
T
,
typename
Allocator
,
enable_if_t
<
std
::
is_converti
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
enable_if_t
<
is_geta
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
void
from_json
(
const
BasicJsonType
&
j
,
std
::
forward_list
<
T
,
Allocator
>&
l
)
{
if
(
JSON_HEDLEY_UNLIKELY
(
!
j
.
is_array
()))
...
...
@@ -145,7 +145,7 @@ void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
// valarray doesn't have an insert method
template
<
typename
BasicJsonType
,
typename
T
,
enable_if_t
<
std
::
is_converti
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
enable_if_t
<
is_geta
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
void
from_json
(
const
BasicJsonType
&
j
,
std
::
valarray
<
T
>&
l
)
{
if
(
JSON_HEDLEY_UNLIKELY
(
!
j
.
is_array
()))
...
...
@@ -153,7 +153,11 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l)
JSON_THROW
(
type_error
::
create
(
302
,
"type must be array, but is "
+
std
::
string
(
j
.
type_name
())));
}
l
.
resize
(
j
.
size
());
std
::
copy
(
j
.
begin
(),
j
.
end
(),
std
::
begin
(
l
));
std
::
transform
(
j
.
begin
(),
j
.
end
(),
std
::
begin
(
l
),
[](
const
BasicJsonType
&
elem
)
{
return
elem
.
template
get
<
T
>();
});
}
template
<
typename
BasicJsonType
,
typename
T
,
std
::
size_t
N
>
...
...
This diff is collapsed.
Click to expand it.
include/nlohmann/detail/macro_scope.hpp
View file @
a048b72f
...
...
@@ -284,3 +284,13 @@
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
void to_json(nlohmann::json& j, const Type& t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
void from_json(const nlohmann::json& j, Type& t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
#ifndef JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_USE_IMPLICIT_CONVERSIONS 1
#endif
#if JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_EXPLICIT
#else
#define JSON_EXPLICIT explicit
#endif
This diff is collapsed.
Click to expand it.
include/nlohmann/detail/macro_unscope.hpp
View file @
a048b72f
...
...
@@ -18,5 +18,6 @@
#undef JSON_HAS_CPP_17
#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
#undef NLOHMANN_BASIC_JSON_TPL
#undef JSON_EXPLICIT
#include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
This diff is collapsed.
Click to expand it.
include/nlohmann/detail/meta/type_traits.hpp
View file @
a048b72f
...
...
@@ -94,6 +94,16 @@ using get_template_function = decltype(std::declval<T>().template get<U>());
template
<
typename
BasicJsonType
,
typename
T
,
typename
=
void
>
struct
has_from_json
:
std
::
false_type
{};
// trait checking if j.get<T> is valid
// use this trait instead of std::is_constructible or std::is_convertible,
// both rely on, or make use of implicit conversions, and thus fail when T
// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)
template
<
typename
BasicJsonType
,
typename
T
>
struct
is_getable
{
static
constexpr
bool
value
=
is_detected
<
get_template_function
,
const
BasicJsonType
&
,
T
>::
value
;
};
template
<
typename
BasicJsonType
,
typename
T
>
struct
has_from_json
<
BasicJsonType
,
T
,
enable_if_t
<
!
is_basic_json
<
T
>::
value
>>
...
...
This diff is collapsed.
Click to expand it.
include/nlohmann/json.hpp
View file @
a048b72f
...
...
@@ -3229,7 +3229,7 @@ class basic_json
#endif
&&
detail
::
is_detected
<
detail
::
get_template_function
,
const
basic_json_t
&
,
ValueType
>::
value
,
int
>::
type
=
0
>
operator
ValueType
()
const
JSON_EXPLICIT
operator
ValueType
()
const
{
// delegate the call to get<>() const
return
get
<
ValueType
>
();
...
...
@@ -3784,8 +3784,9 @@ class basic_json
@since version 1.0.0
*/
// using std::is_convertible in a std::enable_if will fail when using explicit conversions
template
<
class
ValueType
,
typename
std
::
enable_if
<
std
::
is_converti
ble
<
basic_json_t
,
ValueType
>
::
value
detail
::
is_geta
ble
<
basic_json_t
,
ValueType
>
::
value
&&
!
std
::
is_same
<
value_t
,
ValueType
>::
value
,
int
>::
type
=
0
>
ValueType
value
(
const
typename
object_t
::
key_type
&
key
,
const
ValueType
&
default_value
)
const
{
...
...
@@ -3796,7 +3797,7 @@ class basic_json
const
auto
it
=
find
(
key
);
if
(
it
!=
end
())
{
return
*
it
;
return
it
->
template
get
<
ValueType
>()
;
}
return
default_value
;
...
...
@@ -3858,7 +3859,7 @@ class basic_json
@since version 2.0.2
*/
template
<
class
ValueType
,
typename
std
::
enable_if
<
std
::
is_converti
ble
<
basic_json_t
,
ValueType
>
::
value
,
int
>::
type
=
0
>
detail
::
is_geta
ble
<
basic_json_t
,
ValueType
>
::
value
,
int
>::
type
=
0
>
ValueType
value
(
const
json_pointer
&
ptr
,
const
ValueType
&
default_value
)
const
{
// at only works for objects
...
...
@@ -3867,7 +3868,7 @@ class basic_json
// if pointer resolves a value, return it or use default value
JSON_TRY
{
return
ptr
.
get_checked
(
this
);
return
ptr
.
get_checked
(
this
)
.
template
get
<
ValueType
>()
;
}
JSON_INTERNAL_CATCH
(
out_of_range
&
)
{
...
...
@@ -8341,8 +8342,8 @@ class basic_json
}
// collect mandatory members
const
std
::
string
op
=
get_value
(
"op"
,
"op"
,
true
);
const
std
::
string
path
=
get_value
(
op
,
"path"
,
true
);
const
auto
op
=
get_value
(
"op"
,
"op"
,
true
).
template
get
<
std
::
string
>(
);
const
auto
path
=
get_value
(
op
,
"path"
,
true
).
template
get
<
std
::
string
>(
);
json_pointer
ptr
(
path
);
switch
(
get_op
(
op
))
...
...
@@ -8368,7 +8369,7 @@ class basic_json
case
patch_operations
:
:
move
:
{
const
std
::
string
from_path
=
get_value
(
"move"
,
"from"
,
true
);
const
auto
from_path
=
get_value
(
"move"
,
"from"
,
true
).
template
get
<
std
::
string
>(
);
json_pointer
from_ptr
(
from_path
);
// the "from" location must exist - use at()
...
...
@@ -8385,7 +8386,7 @@ class basic_json
case
patch_operations
:
:
copy
:
{
const
std
::
string
from_path
=
get_value
(
"copy"
,
"from"
,
true
);
const
auto
from_path
=
get_value
(
"copy"
,
"from"
,
true
).
template
get
<
std
::
string
>(
);
const
json_pointer
from_ptr
(
from_path
);
// the "from" location must exist - use at()
...
...
This diff is collapsed.
Click to expand it.
single_include/nlohmann/json.hpp
View file @
a048b72f
...
...
@@ -2302,6 +2302,16 @@ JSON_HEDLEY_DIAGNOSTIC_POP
void to_json(nlohmann::json& j, const Type& t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
void from_json(const nlohmann::json& j, Type& t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
#ifndef JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_USE_IMPLICIT_CONVERSIONS 1
#endif
#if JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_EXPLICIT
#else
#define JSON_EXPLICIT explicit
#endif
namespace
nlohmann
{
...
...
@@ -3022,6 +3032,16 @@ using get_template_function = decltype(std::declval<T>().template get<U>());
template
<
typename
BasicJsonType
,
typename
T
,
typename
=
void
>
struct
has_from_json
:
std
::
false_type
{};
// trait checking if j.get<T> is valid
// use this trait instead of std::is_constructible or std::is_convertible,
// both rely on, or make use of implicit conversions, and thus fail when T
// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)
template
<
typename
BasicJsonType
,
typename
T
>
struct
is_getable
{
static
constexpr
bool
value
=
is_detected
<
get_template_function
,
const
BasicJsonType
&
,
T
>::
value
;
};
template
<
typename
BasicJsonType
,
typename
T
>
struct
has_from_json
<
BasicJsonType
,
T
,
enable_if_t
<
!
is_basic_json
<
T
>::
value
>>
...
...
@@ -3507,7 +3527,7 @@ void from_json(const BasicJsonType& j, EnumType& e)
// forward_list doesn't have an insert method
template
<
typename
BasicJsonType
,
typename
T
,
typename
Allocator
,
enable_if_t
<
std
::
is_converti
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
enable_if_t
<
is_geta
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
void
from_json
(
const
BasicJsonType
&
j
,
std
::
forward_list
<
T
,
Allocator
>&
l
)
{
if
(
JSON_HEDLEY_UNLIKELY
(
!
j
.
is_array
()))
...
...
@@ -3524,7 +3544,7 @@ void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
// valarray doesn't have an insert method
template
<
typename
BasicJsonType
,
typename
T
,
enable_if_t
<
std
::
is_converti
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
enable_if_t
<
is_geta
ble
<
BasicJsonType
,
T
>
::
value
,
int
>
=
0
>
void
from_json
(
const
BasicJsonType
&
j
,
std
::
valarray
<
T
>&
l
)
{
if
(
JSON_HEDLEY_UNLIKELY
(
!
j
.
is_array
()))
...
...
@@ -3532,7 +3552,11 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l)
JSON_THROW
(
type_error
::
create
(
302
,
"type must be array, but is "
+
std
::
string
(
j
.
type_name
())));
}
l
.
resize
(
j
.
size
());
std
::
copy
(
j
.
begin
(),
j
.
end
(),
std
::
begin
(
l
));
std
::
transform
(
j
.
begin
(),
j
.
end
(),
std
::
begin
(
l
),
[](
const
BasicJsonType
&
elem
)
{
return
elem
.
template
get
<
T
>();
});
}
template
<
typename
BasicJsonType
,
typename
T
,
std
::
size_t
N
>
...
...
@@ -19508,7 +19532,7 @@ class basic_json
#endif
&&
detail
::
is_detected
<
detail
::
get_template_function
,
const
basic_json_t
&
,
ValueType
>::
value
,
int
>::
type
=
0
>
operator
ValueType
()
const
JSON_EXPLICIT
operator
ValueType
()
const
{
// delegate the call to get<>() const
return
get
<
ValueType
>
();
...
...
@@ -20063,8 +20087,9 @@ class basic_json
@since version 1.0.0
*/
// using std::is_convertible in a std::enable_if will fail when using explicit conversions
template
<
class
ValueType
,
typename
std
::
enable_if
<
std
::
is_converti
ble
<
basic_json_t
,
ValueType
>
::
value
detail
::
is_geta
ble
<
basic_json_t
,
ValueType
>
::
value
&&
!
std
::
is_same
<
value_t
,
ValueType
>::
value
,
int
>::
type
=
0
>
ValueType
value
(
const
typename
object_t
::
key_type
&
key
,
const
ValueType
&
default_value
)
const
{
...
...
@@ -20075,7 +20100,7 @@ class basic_json
const
auto
it
=
find
(
key
);
if
(
it
!=
end
())
{
return
*
it
;
return
it
->
template
get
<
ValueType
>()
;
}
return
default_value
;
...
...
@@ -20137,7 +20162,7 @@ class basic_json
@since version 2.0.2
*/
template
<
class
ValueType
,
typename
std
::
enable_if
<
std
::
is_converti
ble
<
basic_json_t
,
ValueType
>
::
value
,
int
>::
type
=
0
>
detail
::
is_geta
ble
<
basic_json_t
,
ValueType
>
::
value
,
int
>::
type
=
0
>
ValueType
value
(
const
json_pointer
&
ptr
,
const
ValueType
&
default_value
)
const
{
// at only works for objects
...
...
@@ -20146,7 +20171,7 @@ class basic_json
// if pointer resolves a value, return it or use default value
JSON_TRY
{
return
ptr
.
get_checked
(
this
);
return
ptr
.
get_checked
(
this
)
.
template
get
<
ValueType
>()
;
}
JSON_INTERNAL_CATCH
(
out_of_range
&
)
{
...
...
@@ -24620,8 +24645,8 @@ class basic_json
}
// collect mandatory members
const
std
::
string
op
=
get_value
(
"op"
,
"op"
,
true
);
const
std
::
string
path
=
get_value
(
op
,
"path"
,
true
);
const
auto
op
=
get_value
(
"op"
,
"op"
,
true
).
template
get
<
std
::
string
>(
);
const
auto
path
=
get_value
(
op
,
"path"
,
true
).
template
get
<
std
::
string
>(
);
json_pointer
ptr
(
path
);
switch
(
get_op
(
op
))
...
...
@@ -24647,7 +24672,7 @@ class basic_json
case
patch_operations
:
:
move
:
{
const
std
::
string
from_path
=
get_value
(
"move"
,
"from"
,
true
);
const
auto
from_path
=
get_value
(
"move"
,
"from"
,
true
).
template
get
<
std
::
string
>(
);
json_pointer
from_ptr
(
from_path
);
// the "from" location must exist - use at()
...
...
@@ -24664,7 +24689,7 @@ class basic_json
case
patch_operations
:
:
copy
:
{
const
std
::
string
from_path
=
get_value
(
"copy"
,
"from"
,
true
);
const
auto
from_path
=
get_value
(
"copy"
,
"from"
,
true
).
template
get
<
std
::
string
>(
);
const
json_pointer
from_ptr
(
from_path
);
// the "from" location must exist - use at()
...
...
@@ -25086,6 +25111,7 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std
#undef JSON_HAS_CPP_17
#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
#undef NLOHMANN_BASIC_JSON_TPL
#undef JSON_EXPLICIT
// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
#undef JSON_HEDLEY_ALWAYS_INLINE
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-cbor.cpp
View file @
a048b72f
...
...
@@ -1011,21 +1011,21 @@ TEST_CASE("CBOR")
SECTION
(
"0 (0 00000 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x00
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
0.0
);
}
SECTION
(
"-0 (1 00000 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x80
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
-
0.0
);
}
SECTION
(
"2**-24 (0 00000 0000000001)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x00
,
0x01
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
std
::
pow
(
2.0
,
-
24.0
));
}
}
...
...
@@ -1035,7 +1035,7 @@ TEST_CASE("CBOR")
SECTION
(
"infinity (0 11111 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x7c
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
std
::
numeric_limits
<
json
::
number_float_t
>::
infinity
());
CHECK
(
j
.
dump
()
==
"null"
);
}
...
...
@@ -1043,7 +1043,7 @@ TEST_CASE("CBOR")
SECTION
(
"-infinity (1 11111 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0xfc
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
-
std
::
numeric_limits
<
json
::
number_float_t
>::
infinity
());
CHECK
(
j
.
dump
()
==
"null"
);
}
...
...
@@ -1054,21 +1054,21 @@ TEST_CASE("CBOR")
SECTION
(
"1 (0 01111 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x3c
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
1
);
}
SECTION
(
"-2 (1 10000 0000000000)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0xc0
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
-
2
);
}
SECTION
(
"65504 (0 11110 1111111111)"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x7b
,
0xff
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
65504
);
}
}
...
...
@@ -1076,7 +1076,7 @@ TEST_CASE("CBOR")
SECTION
(
"infinity"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x7c
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
!
std
::
isfinite
(
d
));
CHECK
(
j
.
dump
()
==
"null"
);
}
...
...
@@ -1084,7 +1084,7 @@ TEST_CASE("CBOR")
SECTION
(
"NaN"
)
{
json
j
=
json
::
from_cbor
(
std
::
vector
<
uint8_t
>
({
0xf9
,
0x7e
,
0x00
}));
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
std
::
isnan
(
d
));
CHECK
(
j
.
dump
()
==
"null"
);
}
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-constructor1.cpp
View file @
a048b72f
...
...
@@ -341,7 +341,7 @@ TEST_CASE("constructors")
CHECK
(
j
.
type
()
==
json
::
value_t
::
array
);
CHECK
(
j
==
json
({
1
,
2
,
3
,
4
,
5
}));
std
::
valarray
<
int
>
jva
=
j
;
auto
jva
=
j
.
get
<
std
::
valarray
<
int
>>
()
;
CHECK
(
jva
.
size
()
==
va
.
size
());
for
(
size_t
i
=
0
;
i
<
jva
.
size
();
++
i
)
{
...
...
@@ -356,7 +356,7 @@ TEST_CASE("constructors")
CHECK
(
j
.
type
()
==
json
::
value_t
::
array
);
CHECK
(
j
==
json
({
1.2
,
2.3
,
3.4
,
4.5
,
5.6
}));
std
::
valarray
<
double
>
jva
=
j
;
auto
jva
=
j
.
get
<
std
::
valarray
<
double
>>
()
;
CHECK
(
jva
.
size
()
==
va
.
size
());
for
(
size_t
i
=
0
;
i
<
jva
.
size
();
++
i
)
{
...
...
@@ -846,7 +846,7 @@ TEST_CASE("constructors")
CHECK
(
j
.
type
()
==
json
::
value_t
::
number_float
);
// check round trip of NaN
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
((
std
::
isnan
(
d
)
&&
std
::
isnan
(
n
))
==
true
);
// check that NaN is serialized to null
...
...
@@ -861,7 +861,7 @@ TEST_CASE("constructors")
CHECK
(
j
.
type
()
==
json
::
value_t
::
number_float
);
// check round trip of infinity
json
::
number_float_t
d
=
j
;
json
::
number_float_t
d
{
j
}
;
CHECK
(
d
==
n
);
// check that inf is serialized to null
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-conversions.cpp
View file @
a048b72f
...
...
@@ -189,6 +189,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get an object (implicit)"
)
{
json
::
object_t
o_reference
=
{{
"object"
,
json
::
object
()},
...
...
@@ -230,6 +231,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
o
)
==
j
);
}
}
#endif
SECTION
(
"get an array (explicit)"
)
{
...
...
@@ -276,7 +278,8 @@ TEST_CASE("value conversion")
SECTION
(
"reserve is called on containers that supports it"
)
{
// make sure all values are properly copied
std
::
vector
<
int
>
v2
=
json
({
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
});
json
j
({
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
});
auto
v2
=
j
.
get
<
std
::
vector
<
int
>>
();
CHECK
(
v2
.
size
()
==
10
);
}
#endif
...
...
@@ -405,6 +408,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get an array (implicit)"
)
{
json
::
array_t
a_reference
{
json
(
1
),
json
(
1u
),
json
(
2.2
),
...
...
@@ -441,6 +445,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
a
)
==
j
);
}
}
#endif
SECTION
(
"get a string (explicit)"
)
{
...
...
@@ -598,6 +603,7 @@ TEST_CASE("value conversion")
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get a string (implicit)"
)
{
json
::
string_t
s_reference
{
"Hello world"
};
...
...
@@ -623,6 +629,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
s
)
==
j
);
}
}
#endif
SECTION
(
"get a boolean (explicit)"
)
{
...
...
@@ -695,6 +702,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get a boolean (implicit)"
)
{
json
::
boolean_t
b_reference
{
true
};
...
...
@@ -712,6 +720,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
b
)
==
j
);
}
}
#endif
SECTION
(
"get an integer number (explicit)"
)
{
...
...
@@ -962,6 +971,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get an integer number (implicit)"
)
{
json
::
number_integer_t
n_reference
{
42
};
...
...
@@ -1173,6 +1183,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
n
)
==
j_unsigned
);
}
}
#endif
SECTION
(
"get a floating-point number (explicit)"
)
{
...
...
@@ -1234,6 +1245,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get a floating-point number (implicit)"
)
{
json
::
number_float_t
n_reference
{
42.23
};
...
...
@@ -1257,6 +1269,7 @@ TEST_CASE("value conversion")
CHECK
(
json
(
n
).
m_value
.
number_float
==
Approx
(
j
.
m_value
.
number_float
));
}
}
#endif
SECTION
(
"get a binary value (explicit)"
)
{
...
...
@@ -1364,6 +1377,7 @@ TEST_CASE("value conversion")
}
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"get a binary value (implicit)"
)
{
json
::
binary_t
n_reference
{{
1
,
2
,
3
}};
...
...
@@ -1375,6 +1389,7 @@ TEST_CASE("value conversion")
CHECK
(
*
json
(
b
).
m_value
.
binary
==
*
j
.
m_value
.
binary
);
}
}
#endif
SECTION
(
"get an enum"
)
{
...
...
@@ -1481,15 +1496,15 @@ TEST_CASE("value conversion")
SECTION
(
"std::array is larger than JSON"
)
{
std
::
array
<
int
,
6
>
arr6
=
{{
1
,
2
,
3
,
4
,
5
,
6
}};
CHECK_THROWS_AS
(
arr6
=
j1
,
json
::
out_of_range
&
);
CHECK_THROWS_WITH
(
arr6
=
j1
,
"[json.exception.out_of_range.401] "
CHECK_THROWS_AS
(
j1
.
get_to
(
arr6
)
,
json
::
out_of_range
&
);
CHECK_THROWS_WITH
(
j1
.
get_to
(
arr6
)
,
"[json.exception.out_of_range.401] "
"array index 4 is out of range"
);
}
SECTION
(
"std::array is smaller than JSON"
)
{
std
::
array
<
int
,
2
>
arr2
=
{{
8
,
9
}};
arr2
=
j1
;
j1
.
get_to
(
arr2
)
;
CHECK
(
arr2
[
0
]
==
1
);
CHECK
(
arr2
[
1
]
==
2
);
}
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-readme.cpp
View file @
a048b72f
...
...
@@ -174,9 +174,9 @@ TEST_CASE("README" * doctest::skip())
}
// getter/setter
const
std
::
string
tmp
=
j
[
0
]
;
const
auto
tmp
=
j
[
0
].
get
<
std
::
string
>
()
;
j
[
1
]
=
42
;
bool
foo
=
j
.
at
(
2
)
;
bool
foo
{
j
.
at
(
2
)}
;
CHECK
(
foo
==
true
);
// other stuff
...
...
@@ -258,18 +258,18 @@ TEST_CASE("README" * doctest::skip())
// strings
std
::
string
s1
=
"Hello, world!"
;
json
js
=
s1
;
std
::
string
s2
=
js
;
auto
s2
=
js
.
get
<
std
::
string
>
()
;
// Booleans
bool
b1
=
true
;
json
jb
=
b1
;
bool
b2
=
jb
;
bool
b2
{
jb
}
;
CHECK
(
b2
==
true
);
// numbers
int
i
=
42
;
json
jn
=
i
;
double
f
=
jn
;
double
f
{
jn
}
;
CHECK
(
f
==
42
);
// etc.
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-regression.cpp
View file @
a048b72f
...
...
@@ -240,12 +240,12 @@ TEST_CASE("regression tests")
{
json
j1
=
NAN
;
CHECK
(
j1
.
is_number_float
());
json
::
number_float_t
f1
=
j1
;
json
::
number_float_t
f1
{
j1
}
;
CHECK
(
std
::
isnan
(
f1
));
json
j2
=
json
::
number_float_t
(
NAN
);
CHECK
(
j2
.
is_number_float
());
json
::
number_float_t
f2
=
j2
;
json
::
number_float_t
f2
{
j2
}
;
CHECK
(
std
::
isnan
(
f2
));
}
...
...
@@ -253,12 +253,12 @@ TEST_CASE("regression tests")
{
json
j1
=
INFINITY
;
CHECK
(
j1
.
is_number_float
());
json
::
number_float_t
f1
=
j1
;
json
::
number_float_t
f1
{
j1
}
;
CHECK
(
!
std
::
isfinite
(
f1
));
json
j2
=
json
::
number_float_t
(
INFINITY
);
CHECK
(
j2
.
is_number_float
());
json
::
number_float_t
f2
=
j2
;
json
::
number_float_t
f2
{
j2
}
;
CHECK
(
!
std
::
isfinite
(
f2
));
}
}
...
...
@@ -332,11 +332,11 @@ TEST_CASE("regression tests")
json
j
;
ss
>>
j
;
std
::
string
test
=
j
[
"Test"
]
;
auto
test
=
j
[
"Test"
].
get
<
std
::
string
>
()
;
CHECK
(
test
==
"Test1"
);
int
number
=
j
[
"Number"
]
;
int
number
{
j
[
"Number"
]}
;
CHECK
(
number
==
100
);
float
foo
=
j
[
"Foo"
]
;
float
foo
{
j
[
"Foo"
]}
;
CHECK
(
static_cast
<
double
>
(
foo
)
==
Approx
(
42.42
));
}
...
...
@@ -453,6 +453,7 @@ TEST_CASE("regression tests")
CHECK
(
j
[
"string"
]
==
"\u0007\u0007"
);
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #144 - implicit assignment to std::string fails"
)
{
json
o
=
{{
"name"
,
"value"
}};
...
...
@@ -470,6 +471,7 @@ TEST_CASE("regression tests")
CHECK_THROWS_AS
(
s2
=
o
[
"int"
],
json
::
type_error
);
CHECK_THROWS_WITH
(
s2
=
o
[
"int"
],
"[json.exception.type_error.302] type must be string, but is number"
);
}
#endif
SECTION
(
"issue #146 - character following a surrogate pair is skipped"
)
{
...
...
@@ -689,7 +691,7 @@ TEST_CASE("regression tests")
{
"object"
,
{{
"key1"
,
1
},
{
"key2"
,
2
}}},
};
int
at_integer
=
j
.
at
(
"/object/key2"
_json_pointer
)
;
int
at_integer
{
j
.
at
(
"/object/key2"
_json_pointer
)}
;
int
val_integer
=
j
.
value
(
"/object/key2"
_json_pointer
,
0
);
CHECK
(
at_integer
==
val_integer
);
...
...
@@ -1233,6 +1235,7 @@ TEST_CASE("regression tests")
CHECK
(
j
[
"double_value"
].
is_number_float
());
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #464 - VS2017 implicit to std::string conversion fix"
)
{
json
v
=
"test"
;
...
...
@@ -1240,6 +1243,7 @@ TEST_CASE("regression tests")
test
=
v
;
CHECK
(
v
==
"test"
);
}
#endif
SECTION
(
"issue #465 - roundtrip error while parsing 1000000000000000010E5"
)
{
...
...
@@ -1250,6 +1254,7 @@ TEST_CASE("regression tests")
CHECK
(
s1
==
s2
);
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #473 - inconsistent behavior in conversion to array type"
)
{
json
j_array
=
{
1
,
2
,
3
,
4
};
...
...
@@ -1298,6 +1303,7 @@ TEST_CASE("regression tests")
CHECK_THROWS_WITH
(
create
(
j_null
),
"[json.exception.type_error.302] type must be array, but is null"
);
}
}
#endif
SECTION
(
"issue #486 - json::value_t can't be a map's key type in VC++ 2015"
)
{
...
...
@@ -1377,6 +1383,7 @@ TEST_CASE("regression tests")
CHECK_THROWS_AS
(
_
=
json
::
parse
(
vec
),
json
::
parse_error
&
);
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #600 - how does one convert a map in Json back to std::map?"
)
{
SECTION
(
"example 1"
)
...
...
@@ -1409,6 +1416,7 @@ TEST_CASE("regression tests")
CHECK
(
m1
==
m2
);
}
}
#endif
SECTION
(
"issue #602 - BOM not skipped when using json:parse(iterator)"
)
{
...
...
@@ -1417,6 +1425,7 @@ TEST_CASE("regression tests")
CHECK_NOTHROW
(
_
=
json
::
parse
(
i
.
begin
(),
i
.
end
()));
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #702 - conversion from valarray<double> to json fails to build"
)
{
SECTION
(
"original example"
)
...
...
@@ -1445,6 +1454,7 @@ TEST_CASE("regression tests")
"[json.exception.type_error.302] type must be array, but is null"
);
}
}
#endif
SECTION
(
"issue #367 - Behavior of operator>> should more closely resemble that of built-in overloads."
)
{
...
...
@@ -1456,9 +1466,9 @@ TEST_CASE("regression tests")
i1_2_3
>>
j2
;
i1_2_3
>>
j3
;
std
::
map
<
std
::
string
,
std
::
string
>
m1
=
j1
;
std
::
map
<
std
::
string
,
std
::
string
>
m2
=
j2
;
int
i3
=
j3
;
auto
m1
=
j1
.
get
<
std
::
map
<
std
::
string
,
std
::
string
>>
()
;
auto
m2
=
j2
.
get
<
std
::
map
<
std
::
string
,
std
::
string
>>
()
;
int
i3
{
j3
}
;
CHECK
(
m1
==
(
std
::
map
<
std
::
string
,
std
::
string
>
{{
"first"
,
"one"
}}
));
CHECK
(
m2
==
(
std
::
map
<
std
::
string
,
std
::
string
>
{{
"second"
,
"two"
}}
));
...
...
@@ -1513,6 +1523,7 @@ TEST_CASE("regression tests")
CHECK_THROWS_WITH
(
j
.
dump
(),
"[json.exception.type_error.316] invalid UTF-8 byte at index 10: 0x7E"
);
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"issue #843 - converting to array not working"
)
{
json
j
;
...
...
@@ -1520,6 +1531,7 @@ TEST_CASE("regression tests")
j
=
ar
;
ar
=
j
;
}
#endif
SECTION
(
"issue #894 - invalid RFC6902 copy operation succeeds"
)
{
...
...
@@ -1632,7 +1644,7 @@ TEST_CASE("regression tests")
SECTION
(
"issue #977 - Assigning between different json types"
)
{
foo_json
lj
=
ns
::
foo
{
3
};
ns
::
foo
ff
=
lj
;
ns
::
foo
ff
(
lj
)
;
CHECK
(
lj
.
is_object
());
CHECK
(
lj
.
size
()
==
1
);
CHECK
(
lj
[
"x"
]
==
3
);
...
...
@@ -1880,7 +1892,7 @@ TEST_CASE("regression tests")
{
{
json
j
;
NonDefaultFromJsonStruct
x
=
j
;
NonDefaultFromJsonStruct
x
(
j
)
;
NonDefaultFromJsonStruct
y
;
CHECK
(
x
==
y
);
}
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-udt.cpp
View file @
a048b72f
...
...
@@ -312,6 +312,7 @@ TEST_CASE("basic usage" * doctest::test_suite("udt"))
CHECK
(
name
.
m_val
==
"new name"
);
}
#if JSON_USE_IMPLICIT_CONVERSIONS
SECTION
(
"implicit conversions"
)
{
const
udt
::
contact_book
parsed_book
=
big_json
;
...
...
@@ -335,6 +336,7 @@ TEST_CASE("basic usage" * doctest::test_suite("udt"))
CHECK
(
book_name
==
udt
::
name
{
"C++"
});
CHECK
(
book
==
parsed_book
);
}
#endif
}
}
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-udt_macro.cpp
View file @
a048b72f
...
...
@@ -243,7 +243,7 @@ TEST_CASE_TEMPLATE("Serialization/deserialization via NLOHMANN_DEFINE_TYPE_INTRU
CHECK
(
json
(
p1
).
dump
()
==
"{
\"
age
\"
:1,
\"
metadata
\"
:{
\"
haircuts
\"
:2},
\"
name
\"
:
\"
Erik
\"
}"
);
// deserialization
T
p2
=
json
(
p1
);
auto
p2
=
json
(
p1
).
get
<
T
>
(
);
CHECK
(
p2
==
p1
);
// roundtrip
...
...
@@ -253,8 +253,7 @@ TEST_CASE_TEMPLATE("Serialization/deserialization via NLOHMANN_DEFINE_TYPE_INTRU
// check exception in case of missing field
json
j
=
json
(
p1
);
j
.
erase
(
"age"
);
T
p3
;
CHECK_THROWS_WITH_AS
(
p3
=
json
(
j
),
"[json.exception.out_of_range.403] key 'age' not found"
,
json
::
out_of_range
);
CHECK_THROWS_WITH_AS
(
j
.
get
<
T
>
(),
"[json.exception.out_of_range.403] key 'age' not found"
,
json
::
out_of_range
);
}
}
...
...
This diff is collapsed.
Click to expand it.
test/src/unit-unicode.cpp
View file @
a048b72f
...
...
@@ -1168,7 +1168,7 @@ TEST_CASE("Unicode" * doctest::skip())
continue
;
}
std
::
string
ptr
=
s
;
auto
ptr
=
s
.
get
<
std
::
string
>
()
;
// tilde must be followed by 0 or 1
if
(
ptr
==
"~"
)
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment