# nlohmann::basic_json::swap ```cpp // (1) void swap(reference other) noexcept ( std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value ); // (2) friend void swap(reference left, reference right) noexcept ( std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value && std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value ); // (3) void swap(array_t& other); // (4) void swap(object_t& other); // (5) void swap(string_t& other); // (6) void swap(binary_t& other); // (7) 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 individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. If macro [`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. The [`json_base_class_t`](json_base_class_t.md) subobject is exchanged along with the value as well, the same way it is copied or moved by the copy/move constructors and assignment operators. 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 invalidated. Implemented as a friend function callable via ADL. If macro [`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. The [`json_base_class_t`](json_base_class_t.md) subobject is exchanged along with the value as well, the same way it is copied or moved by the copy/move constructors and assignment operators. 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. 4. Exchanges the contents of a JSON object 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. 5. Exchanges the contents of a JSON string 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. 6. Exchanges the contents of a binary 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. 7. Exchanges the contents of a binary 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. Unlike version (6), no binary subtype is involved. ## Parameters `other` (in, out) : value to exchange the contents with `left` (in, out) : value to exchange the contents with `right` (in, out) : value to exchange the contents with ## Exception safety 1. No-throw guarantee: this function never throws exceptions. 2. No-throw guarantee: this function never throws exceptions. 3. Strong guarantee: if an exception is thrown, there are no changes to any JSON value. 4. Strong guarantee: if an exception is thrown, there are no changes to any JSON value. 5. Strong guarantee: if an exception is thrown, there are no changes to any JSON value. 6. Strong guarantee: if an exception is thrown, there are no changes to any JSON value. 7. Strong guarantee: if an exception is thrown, there are no changes to any JSON value. ## Exceptions 1. No-throw guarantee: this function never throws exceptions. 2. No-throw guarantee: this function never throws exceptions. 3. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than arrays; example: `"cannot use swap(array_t&) with boolean"` 4. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than objects; example: `"cannot use swap(object_t&) with boolean"` 5. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than strings; example: `"cannot use swap(string_t&) with boolean"` 6. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than binaries; example: `"cannot use swap(binary_t&) with boolean"` 7. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than binaries; example: `"cannot use swap(binary_t::container_type&) with boolean"` ## Complexity Constant. ## Examples ??? example "Example: (1, 2) swap JSON values" The example below shows how JSON values can be swapped with `swap()`. ```cpp #include #include using json = nlohmann::json; int main() { // create two JSON values json j1 = {1, 2, 3, 4, 5}; json j2 = {{"pi", 3.141592653589793}, {"e", 2.718281828459045}}; // swap the values j1.swap(j2); // output the values std::cout << "j1 = " << j1 << '\n'; std::cout << "j2 = " << j2 << '\n'; } ``` Output: ```json j1 = {"e":2.718281828459045,"pi":3.141592653589793} j2 = [1,2,3,4,5] ``` ??? example "Example: (3) swap array" The example below shows how arrays can be swapped with `swap()`. ```cpp #include #include using json = nlohmann::json; int main() { // create a JSON value json value = {{"array", {1, 2, 3, 4}}}; // create an array_t json::array_t array = {"Snap", "Crackle", "Pop"}; // swap the array stored in the JSON value value["array"].swap(array); // output the values std::cout << "value = " << value << '\n'; std::cout << "array = " << array << '\n'; } ``` Output: ```json value = {"array":["Snap","Crackle","Pop"]} array = [1,2,3,4] ``` ??? example "Example: (4) swap object" The example below shows how objects can be swapped with `swap()`. ```cpp #include #include using json = nlohmann::json; int main() { // create a JSON value json value = { {"translation", {{"one", "eins"}, {"two", "zwei"}}} }; // create an object_t json::object_t object = {{"cow", "Kuh"}, {"dog", "Hund"}}; // swap the object stored in the JSON value value["translation"].swap(object); // output the values std::cout << "value = " << value << '\n'; std::cout << "object = " << object << '\n'; } ``` Output: ```json value = {"translation":{"cow":"Kuh","dog":"Hund"}} object = {"one":"eins","two":"zwei"} ``` ??? example "Example: (5) swap string" The example below shows how strings can be swapped with `swap()`. ```cpp #include #include using json = nlohmann::json; int main() { // create a JSON value json value = { "the good", "the bad", "the ugly" }; // create string_t json::string_t string = "the fast"; // swap the object stored in the JSON value value[1].swap(string); // output the values std::cout << "value = " << value << '\n'; std::cout << "string = " << string << '\n'; } ``` Output: ```json value = ["the good","the fast","the ugly"] string = the bad ``` ??? example "Example: (6) swap binary" The example below shows how binary values can be swapped with `swap()`. ```cpp #include #include using json = nlohmann::json; int main() { // create a binary value json value = json::binary({1, 2, 3}); // create a binary_t json::binary_t binary = {{4, 5, 6}}; // swap the object stored in the JSON value value.swap(binary); // output the values std::cout << "value = " << value << '\n'; std::cout << "binary = " << json(binary) << '\n'; } ``` Output: ```json value = {"bytes":[4,5,6],"subtype":null} binary = {"bytes":[1,2,3],"subtype":null} ``` ## See also - [std::swap](std_swap.md) - [operator=](operator=.md) copy assignment - [basic_json](basic_json.md) create a JSON value ## Version history 1. Since version 1.0.0. Exchanges the `json_base_class_t` subobject along with the value since version 3.13.0. 2. Since version 1.0.0. Exchanges the `json_base_class_t` subobject along with the value since version 3.13.0. 3. Since version 1.0.0. 4. Since version 1.0.0. 5. Since version 1.0.0. 6. Since version 3.8.0. 7. Since version 3.8.0.