1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
### jsoncons::jsonpointer::flatten
```cpp
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
template <typename Json>
Json flatten(const Json& value); (1)
template <typename Json>
Json unflatten(const Json& value, unflatten_options options = unflatten_options::none); (2) (since 0.150.0)
```
(1) flattens a json object or array into a single depth object of JSON Pointer-value pairs.
- The keys in the flattened object are JSONPointer's.
- (until 0.160.0) The values are primitive (string, number, boolean, or null). Empty objects or arrays become null.
- (since 0.160.0) The values can be string, number, boolean, null, empty object (`{}`) or empty array (`[]`).
(2) unflattens a json object of JSON Pointer-value pairs. There is no unique solution,
an integer appearing in a path could be an array index or it could be an object key.
The default is to attempt to preserve arrays. [unflatten_options](unflatten_options.md)
provides additonal options.
#### Return value
(1) A flattened json object of JSON Pointer-value pairs
(2) An unflattened json object
### Examples
#### Flatten and unflatten a json object with non-numeric keys
```cpp
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
// for brevity
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
json input = json::parse(R"(
{
"application": "hiking",
"reputons": [
{
"rater": "HikingAsylum",
"assertion": "advanced",
"rated": "Marilyn C",
"rating": 0.90
},
{
"rater": "HikingAsylum",
"assertion": "intermediate",
"rated": "Hongmin",
"rating": 0.75
}
]
}
)");
json flattened = jsonpointer::flatten(input);
std::cout << pretty_print(flattened) << "\n\n";
json unflattened = jsonpointer::unflatten(flattened);
assert(unflattened == input);
}
```
Output:
```
{
"/application": "hiking",
"/reputons/0/assertion": "advanced",
"/reputons/0/rated": "Marilyn C",
"/reputons/0/rater": "HikingAsylum",
"/reputons/0/rating": 0.9,
"/reputons/1/assertion": "intermediate",
"/reputons/1/rated": "Hongmin",
"/reputons/1/rater": "HikingAsylum",
"/reputons/1/rating": 0.75
}
```
#### Flatten and unflatten a json object with numberlike keys
```cpp
int main()
{
json input = json::parse(R"(
{
"discards": {
"1000": "Record does not exist",
"1004": "Queue limit exceeded",
"1010": "Discarding timed-out partial msg"
},
"warnings": {
"0": "Phone number missing country code",
"1": "State code missing",
"2": "Zip code missing"
}
}
)");
json flattened = jsonpointer::flatten(input);
std::cout << "(1)\n" << pretty_print(flattened) << "\n";
json unflattened1 = jsonpointer::unflatten(flattened);
std::cout << "(2)\n" << pretty_print(unflattened1) << "\n";
json unflattened2 = jsonpointer::unflatten(flattened,
jsonpointer::unflatten_options::assume_object);
std::cout << "(3)\n" << pretty_print(unflattened2) << "\n";
}
```
Output:
```
(1)
{
"/discards/1000": "Record does not exist",
"/discards/1004": "Queue limit exceeded",
"/discards/1010": "Discarding timed-out partial msg",
"/warnings/0": "Phone number missing country code",
"/warnings/1": "State code missing",
"/warnings/2": "Zip code missing"
}
(2)
{
"discards": {
"1000": "Record does not exist",
"1004": "Queue limit exceeded",
"1010": "Discarding timed-out partial msg"
},
"warnings": ["Phone number missing country code", "State code missing", "Zip code missing"]
}
(3)
{
"discards": {
"1000": "Record does not exist",
"1004": "Queue limit exceeded",
"1010": "Discarding timed-out partial msg"
},
"warnings": {
"0": "Phone number missing country code",
"1": "State code missing",
"2": "Zip code missing"
}
}
```
### See also
[jsoncons::jsonpath::flatten](../jsonpath/flatten.md)
|