├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── _config.yml ├── example.c ├── json.c ├── json.h └── sample ├── food.json ├── multidim_arr.json ├── random.json ├── reddit.json ├── rickandmorty.json └── simple.json /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | obj 3 | Makefile 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "C_Cpp.clang_format_style": "LLVM" 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Suhel Chakraborty 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple JSON Parser in C 2 | 3 | An easy to use, very fast JSON parsing implementation written in pure C 4 | 5 | ## Features 6 | 7 | - Fully [RFC-8259](https://datatracker.ietf.org/doc/html/rfc8259) compliant 8 | - Small 2 file library 9 | - Support for all data types 10 | - Simple and efficient hash table implementation to search element by key 11 | - Rust like `result` type used throughout fallible calls 12 | - Compile with `-DJSON_SKIP_WHITESPACE` to parse non-minified JSON with whitespace in between 13 | 14 | ## Setup 15 | 16 | Copy the following from this repository in your source 17 | 18 | - `json.h` 19 | - `json.c` 20 | 21 | And in your code 22 | 23 | ```C 24 | #include "json.h" 25 | ``` 26 | 27 | ## MACROs 28 | 29 | ### The `typed` helper 30 | 31 | A uniform type system used throughout the API 32 | `typed(x)` is alias for `x_t` 33 | 34 | ```C 35 | typed(json_element) // json_element_t 36 | ``` 37 | 38 | ### Rust like `result` 39 | 40 | A tagged union comprising two variants, either `ok` with the data or `err` with `typed(json_error)` with simplified API to manage variants 41 | 42 | ```C 43 | result(json_element) // json_element_result_t 44 | ``` 45 | 46 | ## API 47 | 48 | ### Parse JSON: 49 | 50 | ```C 51 | result(json_element) json_parse(typed(json_string) json_str); 52 | ``` 53 | 54 | ### Find an element by key 55 | 56 | ```C 57 | result(json_element) json_object_find(typed(json_object) * object, typed(json_string) key); 58 | ``` 59 | 60 | ### Print JSON with specified indentation 61 | 62 | ```C 63 | void json_print(typed(json_element) *element, int indent); 64 | ``` 65 | 66 | ### Free JSON from memory 67 | 68 | ```C 69 | void json_free(typed(json_element) *element); 70 | ``` 71 | 72 | ### Convert error into user friendly error String 73 | 74 | ```C 75 | typed(json_string) json_error_to_string(typed(json_error) error); 76 | ``` 77 | 78 | ## Types 79 | 80 | ### JSON String 81 | 82 | A null-terminated char-sequence 83 | 84 | ```C 85 | typed(json_string) // alias for const char * 86 | ``` 87 | 88 | ### JSON Number 89 | 90 | A 64-bit floating point number 91 | 92 | ```C 93 | typed(json_number) // alias for double 94 | ``` 95 | 96 | ### JSON Object 97 | 98 | An array of key-value entries 99 | 100 | ```C 101 | typed(json_object) 102 | ``` 103 | 104 | #### Fields 105 | 106 | | **Name** | **Type** | **Description** | 107 | | --------- | --------------------- | --------------------- | 108 | | `count` | `typed(size)` | The number of entries | 109 | | `entries` | `typed(json_entry) *` | The array of entries | 110 | 111 | ### JSON Array 112 | 113 | A hetergeneous array of elements 114 | 115 | ```C 116 | typed(json_array) 117 | ``` 118 | 119 | #### Fields 120 | 121 | | **Name** | **Type** | **Description** | 122 | | ---------- | ----------------------- | ---------------------- | 123 | | `count` | `typed(size)` | The number of elements | 124 | | `elements` | `typed(json_element) *` | The array of elements | 125 | 126 | ### JSON Boolean 127 | 128 | A boolean value 129 | 130 | ```C 131 | typed(json_boolean) 132 | ``` 133 | 134 | ### Element 135 | 136 | A tagged union representing a JSON value with its type 137 | 138 | ```C 139 | typed(json_element) 140 | ``` 141 | 142 | #### Fields 143 | 144 | | **Name** | **Type** | **Description** | 145 | | -------- | --------------------------- | --------------------- | 146 | | `type` | `typed(json_element_type)` | The type of the value | 147 | | `value` | `typed(json_element_value)` | The actual value | 148 | 149 | ### Element Type 150 | 151 | An enum which represents a JSON type 152 | 153 | ```C 154 | typed(json_element_type) 155 | ``` 156 | 157 | #### Variants 158 | 159 | | **Variant** | **Description** | 160 | | --------------------------- | --------------- | 161 | | `JSON_ELEMENT_TYPE_STRING` | JSON String | 162 | | `JSON_ELEMENT_TYPE_NUMBER` | JSON Number | 163 | | `JSON_ELEMENT_TYPE_OBJECT` | JSON Object | 164 | | `JSON_ELEMENT_TYPE_ARRAY` | JSON Array | 165 | | `JSON_ELEMENT_TYPE_BOOLEAN` | JSON Boolean | 166 | | `JSON_ELEMENT_TYPE_NULL` | JSON Null | 167 | 168 | ### Element Value 169 | 170 | A union for interpreting JSON data 171 | 172 | ```C 173 | typed(json_element_value) 174 | ``` 175 | 176 | #### Fields 177 | 178 | | **Name** | **Type** | **Interpret data as** | 179 | | ------------ | ---------------------- | --------------------- | 180 | | `as_string` | `typed(json_string)` | JSON String | 181 | | `as_number` | `typed(json_number)` | JSON Number | 182 | | `as_object` | `typed(json_object) *` | JSON Object | 183 | | `as_array` | `typed(json_array) *` | JSON Array | 184 | | `as_boolean` | `typed(json_boolean)` | JSON Boolean | 185 | 186 | ### Error 187 | 188 | An enum which represents an error 189 | 190 | ```C 191 | typed(json_error) 192 | ``` 193 | 194 | #### Variants 195 | 196 | | **Variant** | **Description** | 197 | | -------------------------- | ------------------------------ | 198 | | `JSON_ERROR_EMPTY` | Null or empty value | 199 | | `JSON_ERROR_INVALID_TYPE` | Type inference failed | 200 | | `JSON_ERROR_INVALID_KEY` | Key is not a valid string | 201 | | `JSON_ERROR_INVALID_VALUE` | Value is not a valid JSON type | 202 | 203 | ## Usage 204 | 205 | ### Parse with error checking 206 | 207 | ```C 208 | #include "json.h" 209 | 210 | const char * some_json_str = "{\"hello\":\"world\",\"key\":\"value\"}"; 211 | 212 | int main() { 213 | result(json_element) element_result = json_parse(some_json_str); 214 | 215 | // Guard if 216 | if(result_is_err(json_element)(&element_result)) { 217 | typed(json_error) error = result_unwrap_err(json_element)(&element_result); 218 | fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error)); 219 | return -1; 220 | } 221 | 222 | // Extract the data 223 | typed(json_element) element = result_unwrap(json_element)(&element_result); 224 | 225 | // Fetch the "hello" key value 226 | result(json_element) hello_element_result = json_object_find(element.value.as_object, "hello"); 227 | if(result_is_err(json_element)(&hello_element_result)) { 228 | typed(json_error) error = result_unwrap_err(json_element)(&hello_element_result); 229 | fprintf(stderr, "Error getting element \"hello\": %s\n", json_error_to_string(error)); 230 | return -1; 231 | } 232 | typed(json_element) hello_element = result_unwrap(json_element)(&hello_element_result); 233 | 234 | // Use the element 235 | printf("\"hello\": \"%s\"\n", hello_element.value.as_string); 236 | json_print(&element, 2); 237 | json_free(&element); 238 | 239 | return 0; 240 | } 241 | ``` 242 | 243 | Outputs 244 | 245 | ``` 246 | "hello": "world" 247 | { 248 | "hello": "world", 249 | "key": "value" 250 | } 251 | ``` 252 | 253 | ### Example in repository 254 | 255 | 1. Clone this repository `git clone https://github.com/forkachild/C-Simple-JSON-Parser` 256 | 2. Compile the example `clang example.c json.c -o example.out` 257 | 3. Run the binary `./example.out` 258 | 259 | ## FAQs 260 | 261 | ### How to know the type? 262 | 263 | At each Key-Value pair `typed(json_entry_t)`, there is a member `type` 264 | 265 | ```C 266 | #include "json.h" 267 | 268 | ... 269 | 270 | typed(json_element) element = ...; // See example above 271 | typed(json_entry) entry = element.value.as_object->entries[0]; 272 | 273 | switch(entry.element.type) { 274 | case JSON_TYPE_STRING: 275 | // `entry.element.value.as_string` is a `json_string_t` 276 | break; 277 | case JSON_TYPE_NUMBER: 278 | // `entry.element.value.as_number` is a `json_number_t` 279 | break; 280 | case JSON_TYPE_OBJECT: 281 | // `entry.element.value.as_object` is a `json_object_t *` 282 | break; 283 | case JSON_TYPE_ARRAY: 284 | // `entry.element.value.as_array` is a `json_array_t *` 285 | break; 286 | case JSON_TYPE_BOOLEAN: 287 | // `entry.element.value.as_boolean` is a `json_boolean_t` 288 | break; 289 | } 290 | ``` 291 | 292 | ### How to get the count of number of Key-Value pairs? 293 | 294 | In each `typed(json_object)`, there is a member `count` 295 | 296 | ```C 297 | #include "json.h" 298 | 299 | ... 300 | 301 | int i; 302 | 303 | typed(json_element) element = ...; // See example above 304 | typed(json_object) *obj = element.value.as_object; 305 | 306 | for(i = 0; i < obj->count; i++) { 307 | typed(json_entry) entry = obj->entries[i]; 308 | 309 | typed(json_string) key = entry.key; 310 | typed(json_element_type) type = entry.element.type; 311 | typed(json_element_value) value = entry.element.value; 312 | // Do something with `key`, `type` and `value` 313 | } 314 | ``` 315 | 316 | ### How to get the number of elements in an array? 317 | 318 | In each `typed(json_array)`, there is a member `count` 319 | 320 | ```C 321 | #include "json.h" 322 | 323 | ... 324 | 325 | int i; 326 | 327 | typed(json_element) element = ...; // See example above 328 | typed(json_array) *arr = element.value.as_array; 329 | 330 | for(i = 0; i < arr->count; i++) { 331 | typed(json_element) element = arr->elements[i]; 332 | 333 | typed(json_element_type) type = element.type; 334 | typed(json_element_value) value = element.value; 335 | // Do something with `value` 336 | } 337 | ``` 338 | 339 | ### What if the JSON is poorly formatted with uneven whitespace 340 | 341 | Compile using `-DJSON_SKIP_WHITESPACE` 342 | 343 | ## If this helped you in any way you can [buy me a beer](https://www.paypal.me/suhelchakraborty) 344 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include "json.h" 7 | 8 | const char *read_file(const char *path) { 9 | FILE *file = fopen(path, "r"); 10 | if (file == NULL) { 11 | fprintf(stderr, "Expected file \"%s\" not found", path); 12 | return NULL; 13 | } 14 | fseek(file, 0, SEEK_END); 15 | long len = ftell(file); 16 | fseek(file, 0, SEEK_SET); 17 | char *buffer = malloc(len + 1); 18 | 19 | if (buffer == NULL) { 20 | fprintf(stderr, "Unable to allocate memory for file"); 21 | fclose(file); 22 | return NULL; 23 | } 24 | 25 | fread(buffer, 1, len, file); 26 | buffer[len] = '\0'; 27 | 28 | return (const char *)buffer; 29 | } 30 | 31 | int main(void) { 32 | const char *json = read_file("../sample/reddit.json"); 33 | if (json == NULL) { 34 | return -1; 35 | } 36 | 37 | clock_t start, end; 38 | start = clock(); 39 | result(json_element) element_result = json_parse(json); 40 | end = clock(); 41 | 42 | printf("Time taken %fs\n", (double)(end - start) / (double)CLOCKS_PER_SEC); 43 | 44 | free((void *)json); 45 | 46 | if (result_is_err(json_element)(&element_result)) { 47 | typed(json_error) error = result_unwrap_err(json_element)(&element_result); 48 | fprintf(stderr, "Error parsing JSON: %s\n", json_error_to_string(error)); 49 | return -1; 50 | } 51 | typed(json_element) element = result_unwrap(json_element)(&element_result); 52 | 53 | // json_print(&element, 2); 54 | json_free(&element); 55 | 56 | return 0; 57 | } 58 | -------------------------------------------------------------------------------- /json.c: -------------------------------------------------------------------------------- 1 | #include "json.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | /** 11 | * @brief Determines whether a character `ch` is whitespace 12 | */ 13 | #define is_whitespace(ch) (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') 14 | 15 | #ifdef JSON_SKIP_WHITESPACE 16 | void json_skip_whitespace(typed(json_string) * str_ptr) { 17 | while (is_whitespace(**str_ptr)) 18 | (*str_ptr)++; 19 | } 20 | #else 21 | #define json_skip_whitespace(arg) 22 | #endif 23 | 24 | #ifdef JSON_DEBUG 25 | #define log(str, ...) printf(str "\n", ##__VA_ARGS__) 26 | void json_debug_print(typed(json_string) str, typed(size) len) { 27 | for (size_t i = 0; i < len; i++) { 28 | if (str[i] == '\0') 29 | break; 30 | 31 | putchar(str[i]); 32 | } 33 | printf("\n"); 34 | } 35 | #else 36 | #define log(str, ...) 37 | #endif 38 | 39 | #define define_result_type(name) \ 40 | result(name) result_ok(name)(typed(name) value) { \ 41 | result(name) retval = { \ 42 | .is_ok = true, \ 43 | .inner = \ 44 | { \ 45 | .value = value, \ 46 | }, \ 47 | }; \ 48 | return retval; \ 49 | } \ 50 | result(name) result_err(name)(typed(json_error) err) { \ 51 | result(name) retval = { \ 52 | .is_ok = false, \ 53 | .inner = \ 54 | { \ 55 | .err = err, \ 56 | }, \ 57 | }; \ 58 | return retval; \ 59 | } \ 60 | typed(json_boolean) result_is_ok(name)(result(name) * result) { \ 61 | return result->is_ok; \ 62 | } \ 63 | typed(json_boolean) result_is_err(name)(result(name) * result) { \ 64 | return !result->is_ok; \ 65 | } \ 66 | typed(name) result_unwrap(name)(result(name) * result) { \ 67 | return result->inner.value; \ 68 | } \ 69 | typed(json_error) result_unwrap_err(name)(result(name) * result) { \ 70 | return result->inner.err; \ 71 | } 72 | 73 | /** 74 | * @brief Allocate `count` number of items of `type` in memory 75 | * and return the pointer to the newly allocated memory 76 | */ 77 | #define allocN(type, count) (type *)malloc((count) * sizeof(type)) 78 | 79 | /** 80 | * @brief Allocate an item of `type` in memory and return the 81 | * pointer to the newly allocated memory 82 | */ 83 | #define alloc(type) allocN(type, 1) 84 | 85 | /** 86 | * @brief Re-allocate `count` number of items of `type` in memory 87 | * and return the pointer to the newly allocated memory 88 | */ 89 | #define reallocN(ptr, type, count) (type *)realloc(ptr, (count) * sizeof(type)) 90 | 91 | /** 92 | * @brief Parses a JSON element {json_element_t} and moves the string 93 | * pointer to the end of the parsed element 94 | */ 95 | static result(json_entry) json_parse_entry(typed(json_string) *); 96 | 97 | /** 98 | * @brief Guesses the element type at the start of a string 99 | */ 100 | static result(json_element_type) json_guess_element_type(typed(json_string)); 101 | 102 | /** 103 | * @brief Whether a token represents a string. Like '"' 104 | */ 105 | static bool json_is_string(char); 106 | 107 | /** 108 | * @brief Whether a token represents a number. Like '0' 109 | */ 110 | static bool json_is_number(char); 111 | 112 | /** 113 | * @brief Whether a token represents a object. Like '"' 114 | */ 115 | static bool json_is_object(char); 116 | 117 | /** 118 | * @brief Whether a token represents a array. Like '[' 119 | */ 120 | static bool json_is_array(char); 121 | 122 | /** 123 | * @brief Whether a token represents a boolean. Like 't' 124 | */ 125 | static bool json_is_boolean(char); 126 | 127 | /** 128 | * @brief Whether a token represents a null. Like 'n' 129 | */ 130 | static bool json_is_null(char); 131 | 132 | /** 133 | * @brief Parses a JSON element value {json_element_value_t} based 134 | * on the `type` parameter passed and moves the string pointer 135 | * to end of the parsed element 136 | */ 137 | static result(json_element_value) 138 | json_parse_element_value(typed(json_string) *, typed(json_element_type)); 139 | 140 | /** 141 | * @brief Parses a `String` {json_string_t} and moves the string 142 | * pointer to the end of the parsed string 143 | */ 144 | static result(json_element_value) json_parse_string(typed(json_string) *); 145 | 146 | /** 147 | * @brief Parses a `Number` {json_number_t} and moves the string 148 | * pointer to the end of the parsed number 149 | */ 150 | static result(json_element_value) json_parse_number(typed(json_string) *); 151 | 152 | /** 153 | * @brief Parses a `Object` {json_object_t} and moves the string 154 | * pointer to the end of the parsed object 155 | */ 156 | static result(json_element_value) json_parse_object(typed(json_string) *); 157 | 158 | static typed(uint64) json_key_hash(typed(json_string)); 159 | 160 | /** 161 | * @brief Parses a `Array` {json_array_t} and moves the string 162 | * pointer to the end of the parsed array 163 | */ 164 | static result(json_element_value) json_parse_array(typed(json_string) *); 165 | 166 | /** 167 | * @brief Parses a `Boolean` {json_boolean_t} and moves the string 168 | * pointer to the end of the parsed boolean 169 | */ 170 | static result(json_element_value) json_parse_boolean(typed(json_string) *); 171 | 172 | /** 173 | * @brief Skips a Key-Value pair 174 | * 175 | * @return true If a valid entry is skipped 176 | * @return false If entry was invalid (still skips) 177 | */ 178 | static bool json_skip_entry(typed(json_string) *); 179 | 180 | /** 181 | * @brief Skips an element value 182 | * 183 | * @return true If a valid element is skipped 184 | * @return false If element was invalid (still skips) 185 | */ 186 | static bool json_skip_element_value(typed(json_string) *, 187 | typed(json_element_type)); 188 | 189 | /** 190 | * @brief Skips a string value 191 | * 192 | * @return true If a valid string is skipped 193 | * @return false If string was invalid (still skips) 194 | */ 195 | static bool json_skip_string(typed(json_string) *); 196 | 197 | /** 198 | * @brief Skips a number value 199 | * 200 | * @return true If a valid number is skipped 201 | * @return false If number was invalid (still skips) 202 | */ 203 | static bool json_skip_number(typed(json_string) *); 204 | 205 | /** 206 | * @brief Skips an object value 207 | * 208 | * @return true If a valid object is skipped 209 | * @return false If object was invalid (still skips) 210 | */ 211 | static bool json_skip_object(typed(json_string) *); 212 | 213 | /** 214 | * @brief Skips an array value 215 | * 216 | * @return true If a valid array is skipped 217 | * @return false If array was invalid (still skips) 218 | */ 219 | static bool json_skip_array(typed(json_string) *); 220 | 221 | /** 222 | * @brief Skips a boolean value 223 | * 224 | * @return true If a valid boolean is skipped 225 | * @return false If boolean was invalid (still skips) 226 | */ 227 | static bool json_skip_boolean(typed(json_string) *); 228 | 229 | /** 230 | * @brief Moves a JSON string pointer beyond any whitespace 231 | */ 232 | // static void json_skip_whitespace_actual(typed(json_string) *); 233 | 234 | /** 235 | * @brief Moves a JSON string pointer beyond `null` literal 236 | * 237 | */ 238 | static void json_skip_null(typed(json_string) *); 239 | 240 | /** 241 | * @brief Prints a JSON element {json_element_t} type 242 | */ 243 | static void json_print_element(typed(json_element) *, int, int); 244 | 245 | /** 246 | * @brief Prints a `String` {json_string_t} type 247 | */ 248 | static void json_print_string(typed(json_string)); 249 | 250 | /** 251 | * @brief Prints a `Number` {json_number_t} type 252 | */ 253 | static void json_print_number(typed(json_number)); 254 | 255 | /** 256 | * @brief Prints an `Object` {json_object_t} type 257 | */ 258 | static void json_print_object(typed(json_object) *, int, int); 259 | 260 | /** 261 | * @brief Prints an `Array` {json_array_t} type 262 | */ 263 | static void json_print_array(typed(json_array) *, int, int); 264 | 265 | /** 266 | * @brief Prints a `Boolean` {json_boolean_t} type 267 | */ 268 | static void json_print_boolean(typed(json_boolean)); 269 | 270 | /** 271 | * @brief Frees a `String` (json_string_t) from memory 272 | */ 273 | static void json_free_string(typed(json_string)); 274 | 275 | /** 276 | * @brief Frees an `Object` (json_object_t) from memory 277 | */ 278 | static void json_free_object(typed(json_object) *); 279 | 280 | /** 281 | * @brief Frees an `Array` (json_array_t) from memory 282 | */ 283 | static void json_free_array(typed(json_array) *); 284 | 285 | /** 286 | * @brief Utility function to convert an escaped string to a formatted string 287 | */ 288 | static result(json_string) 289 | json_unescape_string(typed(json_string), typed(size)); 290 | 291 | /** 292 | * @brief Offset to the last `"` of a JSON string 293 | */ 294 | static typed(size) json_string_len(typed(json_string)); 295 | 296 | result(json_element) json_parse(typed(json_string) json_str) { 297 | if (json_str == NULL) { 298 | return result_err(json_element)(JSON_ERROR_EMPTY); 299 | } 300 | 301 | typed(size) len = strlen(json_str); 302 | if (len == 0) { 303 | return result_err(json_element)(JSON_ERROR_EMPTY); 304 | } 305 | 306 | result_try(json_element, json_element_type, type, 307 | json_guess_element_type(json_str)); 308 | result_try(json_element, json_element_value, value, 309 | json_parse_element_value(&json_str, type)); 310 | 311 | const typed(json_element) element = { 312 | .type = type, 313 | .value = value, 314 | }; 315 | 316 | return result_ok(json_element)(element); 317 | } 318 | 319 | result(json_entry) json_parse_entry(typed(json_string) * str_ptr) { 320 | result_try(json_entry, json_element_value, key, json_parse_string(str_ptr)); 321 | json_skip_whitespace(str_ptr); 322 | 323 | // Skip the ':' delimiter 324 | (*str_ptr)++; 325 | 326 | json_skip_whitespace(str_ptr); 327 | 328 | result(json_element_type) type_result = json_guess_element_type(*str_ptr); 329 | if (result_is_err(json_element_type)(&type_result)) { 330 | free((void *)key.as_string); 331 | return result_map_err(json_entry, json_element_type, &type_result); 332 | } 333 | typed(json_element_type) type = 334 | result_unwrap(json_element_type)(&type_result); 335 | 336 | result(json_element_value) value_result = 337 | json_parse_element_value(str_ptr, type); 338 | if (result_is_err(json_element_value)(&value_result)) { 339 | free((void *)key.as_string); 340 | return result_map_err(json_entry, json_element_value, &value_result); 341 | } 342 | typed(json_element_value) value = 343 | result_unwrap(json_element_value)(&value_result); 344 | 345 | typed(json_entry) entry = { 346 | .key = key.as_string, 347 | .element = 348 | { 349 | .type = type, 350 | .value = value, 351 | }, 352 | }; 353 | 354 | return result_ok(json_entry)(entry); 355 | } 356 | 357 | result(json_element_type) json_guess_element_type(typed(json_string) str) { 358 | const char ch = *str; 359 | typed(json_element_type) type; 360 | 361 | if (json_is_string(ch)) 362 | type = JSON_ELEMENT_TYPE_STRING; 363 | else if (json_is_object(ch)) 364 | type = JSON_ELEMENT_TYPE_OBJECT; 365 | else if (json_is_array(ch)) 366 | type = JSON_ELEMENT_TYPE_ARRAY; 367 | else if (json_is_null(ch)) 368 | type = JSON_ELEMENT_TYPE_NULL; 369 | else if (json_is_number(ch)) 370 | type = JSON_ELEMENT_TYPE_NUMBER; 371 | else if (json_is_boolean(ch)) 372 | type = JSON_ELEMENT_TYPE_BOOLEAN; 373 | else 374 | return result_err(json_element_type)(JSON_ERROR_INVALID_TYPE); 375 | 376 | return result_ok(json_element_type)(type); 377 | } 378 | 379 | bool json_is_string(char ch) { return ch == '"'; } 380 | 381 | bool json_is_number(char ch) { 382 | return (ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == '.' || 383 | ch == 'e' || ch == 'E'; 384 | } 385 | 386 | bool json_is_object(char ch) { return ch == '{'; } 387 | 388 | bool json_is_array(char ch) { return ch == '['; } 389 | 390 | bool json_is_boolean(char ch) { return ch == 't' || ch == 'f'; } 391 | 392 | bool json_is_null(char ch) { return ch == 'n'; } 393 | 394 | result(json_element_value) 395 | json_parse_element_value(typed(json_string) * str_ptr, 396 | typed(json_element_type) type) { 397 | switch (type) { 398 | case JSON_ELEMENT_TYPE_STRING: 399 | return json_parse_string(str_ptr); 400 | case JSON_ELEMENT_TYPE_NUMBER: 401 | return json_parse_number(str_ptr); 402 | case JSON_ELEMENT_TYPE_OBJECT: 403 | return json_parse_object(str_ptr); 404 | case JSON_ELEMENT_TYPE_ARRAY: 405 | return json_parse_array(str_ptr); 406 | case JSON_ELEMENT_TYPE_BOOLEAN: 407 | return json_parse_boolean(str_ptr); 408 | case JSON_ELEMENT_TYPE_NULL: 409 | json_skip_null(str_ptr); 410 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 411 | default: 412 | return result_err(json_element_value)(JSON_ERROR_INVALID_TYPE); 413 | } 414 | } 415 | 416 | result(json_element_value) json_parse_string(typed(json_string) * str_ptr) { 417 | // Skip the first '"' character 418 | (*str_ptr)++; 419 | 420 | typed(size) len = json_string_len(*str_ptr); 421 | if (len == 0) { 422 | // Skip the end quote 423 | (*str_ptr)++; 424 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 425 | } 426 | 427 | result_try(json_element_value, json_string, output, 428 | json_unescape_string(*str_ptr, len)); 429 | 430 | // Skip to beyond the string 431 | (*str_ptr) += len + 1; 432 | 433 | typed(json_element_value) retval = {0}; 434 | retval.as_string = output; 435 | 436 | return result_ok(json_element_value)(retval); 437 | } 438 | 439 | result(json_element_value) json_parse_number(typed(json_string) * str_ptr) { 440 | typed(json_string) temp_str = *str_ptr; 441 | bool has_decimal = false; 442 | 443 | while (json_is_number(*temp_str)) { 444 | if (*temp_str == '.') { 445 | has_decimal = true; 446 | } 447 | 448 | temp_str++; 449 | } 450 | 451 | typed(json_number) number = {0}; 452 | typed(json_number_value) val = {0}; 453 | 454 | if (has_decimal) { 455 | errno = 0; 456 | 457 | val.as_double = strtod(*str_ptr, (char **)str_ptr); 458 | 459 | number.type = JSON_NUMBER_TYPE_DOUBLE; 460 | number.value = val; 461 | 462 | if (errno == EINVAL || errno == ERANGE) 463 | return result_err(json_element_value)(JSON_ERROR_INVALID_VALUE); 464 | } else { 465 | errno = 0; 466 | 467 | val.as_long = strtol(*str_ptr, (char **)str_ptr, 10); 468 | 469 | number.type = JSON_NUMBER_TYPE_LONG; 470 | number.value = val; 471 | 472 | if (errno == EINVAL || errno == ERANGE) 473 | return result_err(json_element_value)(JSON_ERROR_INVALID_VALUE); 474 | } 475 | 476 | typed(json_element_value) retval = {0}; 477 | retval.as_number = number; 478 | 479 | return result_ok(json_element_value)(retval); 480 | } 481 | 482 | result(json_element_value) json_parse_object(typed(json_string) * str_ptr) { 483 | typed(json_string) temp_str = *str_ptr; 484 | 485 | // ******* First find the number of valid entries ******* 486 | // Skip the first '{' character 487 | temp_str++; 488 | 489 | json_skip_whitespace(&temp_str); 490 | 491 | if (*temp_str == '}') { 492 | // Skip the end '}' in the actual pointer 493 | (*str_ptr) = temp_str + 1; 494 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 495 | } 496 | 497 | typed(size) count = 0; 498 | 499 | while (*temp_str != '\0') { 500 | // Skip any accidental whitespace 501 | json_skip_whitespace(&temp_str); 502 | 503 | // If the entry could be skipped 504 | if (json_skip_entry(&temp_str)) { 505 | count++; 506 | } 507 | 508 | // Skip any accidental whitespace 509 | json_skip_whitespace(&temp_str); 510 | 511 | if (*temp_str == '}') 512 | break; 513 | 514 | // Skip the ',' to move to the next entry 515 | temp_str++; 516 | } 517 | 518 | if (count == 0) 519 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 520 | 521 | // ******* Initialize the hash map ******* 522 | // Now we have a perfectly sized hash map 523 | typed(json_entry) **entries = allocN(typed(json_entry) *, count); 524 | for (size_t i = 0; i < count; i++) 525 | entries[i] = NULL; 526 | 527 | // Skip the first '{' character 528 | (*str_ptr)++; 529 | 530 | json_skip_whitespace(str_ptr); 531 | 532 | while (**str_ptr != '\0') { 533 | // Skip any accidental whitespace 534 | json_skip_whitespace(str_ptr); 535 | result(json_entry) entry_result = json_parse_entry(str_ptr); 536 | 537 | if (result_is_ok(json_entry)(&entry_result)) { 538 | typed(json_entry) entry = result_unwrap(json_entry)(&entry_result); 539 | typed(uint64) bucket = json_key_hash(entry.key) % count; 540 | 541 | // Bucket size is exactly count. So there will be at max 542 | // count misses in the worst case 543 | for (size_t i = 0; i < count; i++) { 544 | if (entries[bucket] == NULL) { 545 | typed(json_entry) *temp_entry = alloc(typed(json_entry)); 546 | memcpy(temp_entry, &entry, sizeof(typed(json_entry))); 547 | entries[bucket] = temp_entry; 548 | break; 549 | } 550 | 551 | bucket = (bucket + 1) % count; 552 | } 553 | } 554 | 555 | // Skip any accidental whitespace 556 | json_skip_whitespace(str_ptr); 557 | 558 | if (**str_ptr == '}') 559 | break; 560 | 561 | // Skip the ',' to move to the next entry 562 | (*str_ptr)++; 563 | } 564 | 565 | // Skip the '}' closing brace 566 | (*str_ptr)++; 567 | 568 | typed(json_object) *object = alloc(typed(json_object)); 569 | object->count = count; 570 | object->entries = entries; 571 | 572 | typed(json_element_value) retval = {0}; 573 | retval.as_object = object; 574 | 575 | return result_ok(json_element_value)(retval); 576 | } 577 | 578 | typed(uint64) json_key_hash(typed(json_string) str) { 579 | typed(uint64) hash = 0; 580 | 581 | while (*str != '\0') 582 | hash += (hash * 31) + *str++; 583 | 584 | return hash; 585 | } 586 | 587 | result(json_element_value) json_parse_array(typed(json_string) * str_ptr) { 588 | // Skip the starting '[' character 589 | (*str_ptr)++; 590 | 591 | json_skip_whitespace(str_ptr); 592 | 593 | // Unfortunately the array is empty 594 | if (**str_ptr == ']') { 595 | // Skip the end ']' 596 | (*str_ptr)++; 597 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 598 | } 599 | 600 | typed(size) count = 0; 601 | typed(json_element) *elements = NULL; 602 | 603 | while (**str_ptr != '\0') { 604 | json_skip_whitespace(str_ptr); 605 | 606 | // Guess the type 607 | result(json_element_type) type_result = json_guess_element_type(*str_ptr); 608 | if (result_is_ok(json_element_type)(&type_result)) { 609 | typed(json_element_type) type = 610 | result_unwrap(json_element_type)(&type_result); 611 | 612 | // Parse the value based on guessed type 613 | result(json_element_value) value_result = 614 | json_parse_element_value(str_ptr, type); 615 | if (result_is_ok(json_element_value)(&value_result)) { 616 | typed(json_element_value) value = 617 | result_unwrap(json_element_value)(&value_result); 618 | 619 | count++; 620 | elements = reallocN(elements, typed(json_element), count); 621 | elements[count - 1].type = type; 622 | elements[count - 1].value = value; 623 | } 624 | 625 | json_skip_whitespace(str_ptr); 626 | } 627 | 628 | // Reached the end 629 | if (**str_ptr == ']') 630 | break; 631 | 632 | // Skip the ',' 633 | (*str_ptr)++; 634 | } 635 | 636 | // Skip the ']' closing array 637 | (*str_ptr)++; 638 | 639 | if (count == 0) 640 | return result_err(json_element_value)(JSON_ERROR_EMPTY); 641 | 642 | typed(json_array) *array = alloc(typed(json_array)); 643 | array->count = count; 644 | array->elements = elements; 645 | 646 | typed(json_element_value) retval = {0}; 647 | retval.as_array = array; 648 | 649 | return result_ok(json_element_value)(retval); 650 | } 651 | 652 | result(json_element_value) json_parse_boolean(typed(json_string) * str_ptr) { 653 | typed(json_boolean) output; 654 | 655 | switch (**str_ptr) { 656 | case 't': 657 | output = true; 658 | (*str_ptr) += 4; 659 | break; 660 | 661 | case 'f': 662 | output = false; 663 | (*str_ptr) += 5; 664 | break; 665 | } 666 | 667 | typed(json_element_value) retval = {0}; 668 | retval.as_boolean = output; 669 | 670 | return result_ok(json_element_value)(retval); 671 | } 672 | 673 | result(json_element) 674 | json_object_find(typed(json_object) * obj, typed(json_string) key) { 675 | if (key == NULL || strlen(key) == 0) 676 | return result_err(json_element)(JSON_ERROR_INVALID_KEY); 677 | 678 | typed(uint64) bucket = json_key_hash(key) % obj->count; 679 | 680 | // Bucket size is exactly obj->count. So there will be at max 681 | // obj->count misses in the worst case 682 | for (size_t i = 0; i < obj->count; i++) { 683 | typed(json_entry) *entry = obj->entries[bucket]; 684 | if (strcmp(key, entry->key) == 0) 685 | return result_ok(json_element)(entry->element); 686 | 687 | bucket = (bucket + 1) % obj->count; 688 | } 689 | 690 | return result_err(json_element)(JSON_ERROR_INVALID_KEY); 691 | } 692 | 693 | bool json_skip_entry(typed(json_string) * str_ptr) { 694 | json_skip_string(str_ptr); 695 | 696 | json_skip_whitespace(str_ptr); 697 | 698 | // Skip the ':' delimiter 699 | (*str_ptr)++; 700 | 701 | json_skip_whitespace(str_ptr); 702 | 703 | result(json_element_type) type_result = json_guess_element_type(*str_ptr); 704 | if (result_is_err(json_element_type)(&type_result)) 705 | return false; 706 | 707 | typed(json_element_type) type = 708 | result_unwrap(json_element_type)(&type_result); 709 | 710 | return json_skip_element_value(str_ptr, type); 711 | } 712 | 713 | bool json_skip_element_value(typed(json_string) * str_ptr, 714 | typed(json_element_type) type) { 715 | switch (type) { 716 | case JSON_ELEMENT_TYPE_STRING: 717 | return json_skip_string(str_ptr); 718 | case JSON_ELEMENT_TYPE_NUMBER: 719 | return json_skip_number(str_ptr); 720 | case JSON_ELEMENT_TYPE_OBJECT: 721 | return json_skip_object(str_ptr); 722 | case JSON_ELEMENT_TYPE_ARRAY: 723 | return json_skip_array(str_ptr); 724 | case JSON_ELEMENT_TYPE_BOOLEAN: 725 | return json_skip_boolean(str_ptr); 726 | case JSON_ELEMENT_TYPE_NULL: 727 | json_skip_null(str_ptr); 728 | return false; 729 | 730 | default: 731 | return false; 732 | } 733 | } 734 | 735 | bool json_skip_string(typed(json_string) * str_ptr) { 736 | // Skip the initial '"' 737 | (*str_ptr)++; 738 | 739 | // Find the length till the last '"' 740 | typed(size) len = json_string_len(*str_ptr); 741 | 742 | // Skip till the end of the string 743 | (*str_ptr) += len + 1; 744 | 745 | return len > 0; 746 | } 747 | 748 | bool json_skip_number(typed(json_string) * str_ptr) { 749 | while (json_is_number(**str_ptr)) { 750 | (*str_ptr)++; 751 | } 752 | 753 | return true; 754 | } 755 | 756 | bool json_skip_object(typed(json_string) * str_ptr) { 757 | // Skip the first '{' character 758 | (*str_ptr)++; 759 | 760 | json_skip_whitespace(str_ptr); 761 | 762 | if (**str_ptr == '}') { 763 | // Skip the end '}' 764 | (*str_ptr)++; 765 | return false; 766 | } 767 | 768 | while (**str_ptr != '\0') { 769 | // Skip any accidental whitespace 770 | json_skip_whitespace(str_ptr); 771 | 772 | json_skip_entry(str_ptr); 773 | 774 | // Skip any accidental whitespace 775 | json_skip_whitespace(str_ptr); 776 | 777 | if (**str_ptr == '}') 778 | break; 779 | 780 | // Skip the ',' to move to the next entry 781 | (*str_ptr)++; 782 | } 783 | 784 | // Skip the '}' closing brace 785 | (*str_ptr)++; 786 | 787 | return true; 788 | } 789 | 790 | bool json_skip_array(typed(json_string) * str_ptr) { 791 | // Skip the starting '[' character 792 | (*str_ptr)++; 793 | 794 | json_skip_whitespace(str_ptr); 795 | 796 | // Unfortunately the array is empty 797 | if (**str_ptr == ']') { 798 | // Skip the end ']' 799 | (*str_ptr)++; 800 | return false; 801 | } 802 | 803 | while (**str_ptr != '\0') { 804 | json_skip_whitespace(str_ptr); 805 | 806 | // Guess the type 807 | result(json_element_type) type_result = json_guess_element_type(*str_ptr); 808 | if (result_is_ok(json_element_type)(&type_result)) { 809 | typed(json_element_type) type = 810 | result_unwrap(json_element_type)(&type_result); 811 | 812 | // Parse the value based on guessed type 813 | json_skip_element_value(str_ptr, type); 814 | 815 | json_skip_whitespace(str_ptr); 816 | } 817 | 818 | // Reached the end 819 | if (**str_ptr == ']') 820 | break; 821 | 822 | // Skip the ',' 823 | (*str_ptr)++; 824 | } 825 | 826 | // Skip the ']' closing array 827 | (*str_ptr)++; 828 | 829 | return true; 830 | } 831 | 832 | bool json_skip_boolean(typed(json_string) * str_ptr) { 833 | switch (**str_ptr) { 834 | case 't': 835 | (*str_ptr) += 4; 836 | return true; 837 | 838 | case 'f': 839 | (*str_ptr) += 5; 840 | return true; 841 | } 842 | 843 | return false; 844 | } 845 | 846 | void json_skip_null(typed(json_string) * str_ptr) { (*str_ptr) += 4; } 847 | 848 | void json_print(typed(json_element) * element, int indent) { 849 | json_print_element(element, indent, 0); 850 | } 851 | 852 | void json_print_element(typed(json_element) * element, int indent, 853 | int indent_level) { 854 | 855 | switch (element->type) { 856 | case JSON_ELEMENT_TYPE_STRING: 857 | json_print_string(element->value.as_string); 858 | break; 859 | case JSON_ELEMENT_TYPE_NUMBER: 860 | json_print_number(element->value.as_number); 861 | break; 862 | case JSON_ELEMENT_TYPE_OBJECT: 863 | json_print_object(element->value.as_object, indent, indent_level); 864 | break; 865 | case JSON_ELEMENT_TYPE_ARRAY: 866 | json_print_array(element->value.as_array, indent, indent_level); 867 | break; 868 | case JSON_ELEMENT_TYPE_BOOLEAN: 869 | json_print_boolean(element->value.as_boolean); 870 | break; 871 | case JSON_ELEMENT_TYPE_NULL: 872 | break; 873 | // Do nothing 874 | } 875 | } 876 | 877 | void json_print_string(typed(json_string) string) { printf("\"%s\"", string); } 878 | 879 | void json_print_number(typed(json_number) number) { 880 | switch (number.type) { 881 | case JSON_NUMBER_TYPE_DOUBLE: 882 | printf("%f", number.value.as_double); 883 | break; 884 | 885 | case JSON_NUMBER_TYPE_LONG: 886 | printf("%ld", number.value.as_long); 887 | break; 888 | } 889 | } 890 | 891 | void json_print_object(typed(json_object) * object, int indent, 892 | int indent_level) { 893 | printf("{\n"); 894 | 895 | for (size_t i = 0; i < object->count; i++) { 896 | for (int j = 0; j < indent * (indent_level + 1); j++) 897 | printf(" "); 898 | 899 | typed(json_entry) *entry = object->entries[i]; 900 | 901 | json_print_string(entry->key); 902 | printf(": "); 903 | json_print_element(&entry->element, indent, indent_level + 1); 904 | 905 | if (i != object->count - 1) 906 | printf(","); 907 | printf("\n"); 908 | } 909 | 910 | for (int j = 0; j < indent * indent_level; j++) 911 | printf(" "); 912 | printf("}"); 913 | } 914 | 915 | void json_print_array(typed(json_array) * array, int indent, int indent_level) { 916 | printf("[\n"); 917 | 918 | for (size_t i = 0; i < array->count; i++) { 919 | typed(json_element) element = array->elements[i]; 920 | for (int j = 0; j < indent * (indent_level + 1); j++) 921 | printf(" "); 922 | json_print_element(&element, indent, indent_level + 1); 923 | 924 | if (i != array->count - 1) 925 | printf(","); 926 | printf("\n"); 927 | } 928 | 929 | for (int i = 0; i < indent * indent_level; i++) 930 | printf(" "); 931 | printf("]"); 932 | } 933 | 934 | void json_print_boolean(typed(json_boolean) boolean) { 935 | printf("%s", boolean ? "true" : "false"); 936 | } 937 | 938 | void json_free(typed(json_element) * element) { 939 | switch (element->type) { 940 | case JSON_ELEMENT_TYPE_STRING: 941 | json_free_string(element->value.as_string); 942 | break; 943 | 944 | case JSON_ELEMENT_TYPE_OBJECT: 945 | json_free_object(element->value.as_object); 946 | break; 947 | 948 | case JSON_ELEMENT_TYPE_ARRAY: 949 | json_free_array(element->value.as_array); 950 | break; 951 | 952 | case JSON_ELEMENT_TYPE_NUMBER: 953 | case JSON_ELEMENT_TYPE_BOOLEAN: 954 | case JSON_ELEMENT_TYPE_NULL: 955 | // Do nothing 956 | break; 957 | } 958 | } 959 | 960 | void json_free_string(typed(json_string) string) { free((void *)string); } 961 | 962 | void json_free_object(typed(json_object) * object) { 963 | if (object == NULL) 964 | return; 965 | 966 | if (object->count == 0) { 967 | free(object); 968 | return; 969 | } 970 | 971 | for (size_t i = 0; i < object->count; i++) { 972 | typed(json_entry) *entry = object->entries[i]; 973 | 974 | if (entry != NULL) { 975 | free((void *)entry->key); 976 | json_free(&entry->element); 977 | free(entry); 978 | } 979 | } 980 | 981 | free(object->entries); 982 | free(object); 983 | } 984 | 985 | void json_free_array(typed(json_array) * array) { 986 | if (array == NULL) 987 | return; 988 | 989 | if (array->count == 0) { 990 | free(array); 991 | return; 992 | } 993 | 994 | // Recursively free each element in the array 995 | for (size_t i = 0; i < array->count; i++) { 996 | typed(json_element) element = array->elements[i]; 997 | json_free(&element); 998 | } 999 | 1000 | // Lastly free 1001 | free(array->elements); 1002 | free(array); 1003 | } 1004 | 1005 | typed(json_string) json_error_to_string(typed(json_error) error) { 1006 | switch (error) { 1007 | case JSON_ERROR_EMPTY: 1008 | return "Empty"; 1009 | case JSON_ERROR_INVALID_KEY: 1010 | return "Invalid key"; 1011 | case JSON_ERROR_INVALID_TYPE: 1012 | return "Invalid type"; 1013 | case JSON_ERROR_INVALID_VALUE: 1014 | return "Invalid value"; 1015 | 1016 | default: 1017 | return "Unknown error"; 1018 | } 1019 | } 1020 | 1021 | typed(size) json_string_len(typed(json_string) str) { 1022 | typed(size) len = 0; 1023 | 1024 | typed(json_string) iter = str; 1025 | while (*iter != '\0') { 1026 | if (*iter == '\\') 1027 | iter += 2; 1028 | 1029 | if (*iter == '"') { 1030 | len = iter - str; 1031 | break; 1032 | } 1033 | 1034 | iter++; 1035 | } 1036 | 1037 | return len; 1038 | } 1039 | 1040 | result(json_string) 1041 | json_unescape_string(typed(json_string) str, typed(size) len) { 1042 | typed(size) count = 0; 1043 | typed(json_string) iter = str; 1044 | 1045 | while ((size_t)(iter - str) < len) { 1046 | if (*iter == '\\') 1047 | iter++; 1048 | 1049 | count++; 1050 | iter++; 1051 | } 1052 | 1053 | char *output = allocN(char, count + 1); 1054 | typed(size) offset = 0; 1055 | iter = str; 1056 | 1057 | while ((size_t)(iter - str) < len) { 1058 | if (*iter == '\\') { 1059 | iter++; 1060 | 1061 | switch (*iter) { 1062 | case 'b': 1063 | output[offset] = '\b'; 1064 | break; 1065 | case 'f': 1066 | output[offset] = '\f'; 1067 | break; 1068 | case 'n': 1069 | output[offset] = '\n'; 1070 | break; 1071 | case 'r': 1072 | output[offset] = '\r'; 1073 | break; 1074 | case 't': 1075 | output[offset] = '\t'; 1076 | break; 1077 | case '"': 1078 | output[offset] = '"'; 1079 | break; 1080 | case '\\': 1081 | output[offset] = '\\'; 1082 | break; 1083 | default: 1084 | return result_err(json_string)(JSON_ERROR_INVALID_VALUE); 1085 | } 1086 | } else { 1087 | output[offset] = *iter; 1088 | } 1089 | 1090 | offset++; 1091 | iter++; 1092 | } 1093 | 1094 | output[offset] = '\0'; 1095 | return result_ok(json_string)((typed(json_string))output); 1096 | } 1097 | 1098 | define_result_type(json_element_type) 1099 | define_result_type(json_element_value) 1100 | define_result_type(json_element) 1101 | define_result_type(json_entry) 1102 | define_result_type(json_string) 1103 | define_result_type(size) 1104 | 1105 | -------------------------------------------------------------------------------- /json.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #ifndef __cplusplus 6 | typedef unsigned int bool; 7 | #define true (1) 8 | #define false (0) 9 | #endif 10 | 11 | #define typed(name) name##_t 12 | 13 | typedef const char *typed(json_string); 14 | typedef bool typed(json_boolean); 15 | 16 | typedef union json_number_value_u typed(json_number_value); 17 | typedef signed long typed(json_number_long); 18 | typedef double typed(json_number_double); 19 | typedef struct json_number_s typed(json_number); 20 | typedef union json_element_value_u typed(json_element_value); 21 | typedef struct json_element_s typed(json_element); 22 | typedef struct json_entry_s typed(json_entry); 23 | typedef struct json_object_s typed(json_object); 24 | typedef struct json_array_s typed(json_array); 25 | 26 | #define result(name) name##_result_t 27 | #define result_ok(name) name##_result_ok 28 | #define result_err(name) name##_result_err 29 | #define result_is_ok(name) name##_result_is_ok 30 | #define result_is_err(name) name##_result_is_err 31 | #define result_unwrap(name) name##_result_unwrap 32 | #define result_unwrap_err(name) name##_result_unwrap_err 33 | #define result_map_err(outer_name, inner_name, value) \ 34 | result_err(outer_name)(result_unwrap_err(inner_name)(value)) 35 | #define result_try(outer_name, inner_name, lvalue, rvalue) \ 36 | result(inner_name) lvalue##_result = rvalue; \ 37 | if (result_is_err(inner_name)(&lvalue##_result)) \ 38 | return result_map_err(outer_name, inner_name, &lvalue##_result); \ 39 | const typed(inner_name) lvalue = result_unwrap(inner_name)(&lvalue##_result); 40 | #define declare_result_type(name) \ 41 | typedef struct name##_result_s { \ 42 | typed(json_boolean) is_ok; \ 43 | union { \ 44 | typed(name) value; \ 45 | typed(json_error) err; \ 46 | } inner; \ 47 | } result(name); \ 48 | result(name) result_ok(name)(typed(name)); \ 49 | result(name) result_err(name)(typed(json_error)); \ 50 | typed(json_boolean) result_is_ok(name)(result(name) *); \ 51 | typed(json_boolean) result_is_err(name)(result(name) *); \ 52 | typed(name) result_unwrap(name)(result(name) *); \ 53 | typed(json_error) result_unwrap_err(name)(result(name) *); 54 | 55 | typedef enum json_element_type_e { 56 | JSON_ELEMENT_TYPE_STRING = 0, 57 | JSON_ELEMENT_TYPE_NUMBER, 58 | JSON_ELEMENT_TYPE_OBJECT, 59 | JSON_ELEMENT_TYPE_ARRAY, 60 | JSON_ELEMENT_TYPE_BOOLEAN, 61 | JSON_ELEMENT_TYPE_NULL 62 | } typed(json_element_type); 63 | 64 | typedef enum json_number_type_e { 65 | JSON_NUMBER_TYPE_LONG = 0, 66 | JSON_NUMBER_TYPE_DOUBLE, 67 | } typed(json_number_type); 68 | 69 | union json_number_value_u { 70 | typed(json_number_long) as_long; 71 | typed(json_number_double) as_double; 72 | }; 73 | 74 | struct json_number_s { 75 | typed(json_number_type) type; 76 | typed(json_number_value) value; 77 | }; 78 | 79 | union json_element_value_u { 80 | typed(json_string) as_string; 81 | typed(json_number) as_number; 82 | typed(json_object) * as_object; 83 | typed(json_array) * as_array; 84 | typed(json_boolean) as_boolean; 85 | }; 86 | 87 | struct json_element_s { 88 | typed(json_element_type) type; 89 | typed(json_element_value) value; 90 | }; 91 | 92 | struct json_entry_s { 93 | typed(json_string) key; 94 | typed(json_element) element; 95 | }; 96 | 97 | struct json_object_s { 98 | typed(size) count; 99 | typed(json_entry) * *entries; 100 | }; 101 | 102 | struct json_array_s { 103 | typed(size) count; 104 | typed(json_element) * elements; 105 | }; 106 | 107 | typedef enum json_error_e { 108 | JSON_ERROR_EMPTY = 0, 109 | JSON_ERROR_INVALID_TYPE, 110 | JSON_ERROR_INVALID_KEY, 111 | JSON_ERROR_INVALID_VALUE 112 | } typed(json_error); 113 | 114 | declare_result_type(json_element_type) 115 | declare_result_type(json_element_value) 116 | declare_result_type(json_element) 117 | declare_result_type(json_entry) 118 | declare_result_type(json_string) 119 | declare_result_type(size) 120 | 121 | /** 122 | * @brief Parses a JSON string into a JSON element {json_element_t} 123 | * with a fallible `result` type 124 | * 125 | * @param json_str The raw JSON string 126 | * @return The parsed {json_element_t} wrapped in a `result` type 127 | */ 128 | result(json_element) json_parse(typed(json_string) json_str); 129 | 130 | /** 131 | * @brief Tries to get the element by key. If not found, returns 132 | * a {JSON_ERROR_INVALID_KEY} error 133 | * 134 | * @param object The object to find the key in 135 | * @param key The key of the element to be found 136 | * @return Either a {json_element_t} or {json_error_t} 137 | */ 138 | result(json_element) 139 | json_object_find(typed(json_object) * object, typed(json_string) key); 140 | 141 | /** 142 | * @brief Prints a JSON element {json_element_t} with proper 143 | * indentation 144 | * 145 | * @param indent The number of spaces to indent each level by 146 | */ 147 | void json_print(typed(json_element) * element, int indent); 148 | 149 | /** 150 | * @brief Frees a JSON element {json_element_t} from memory 151 | * 152 | * @param element The JSON element {json_element_t} to free 153 | */ 154 | void json_free(typed(json_element) * element); 155 | 156 | /** 157 | * @brief Returns a string representation of JSON error {json_error_t} type 158 | * 159 | * @param error The JSON error enum {json_error_t} type 160 | * @return The string representation 161 | */ 162 | typed(json_string) json_error_to_string(typed(json_error) error); 163 | 164 | -------------------------------------------------------------------------------- /sample/food.json: -------------------------------------------------------------------------------- 1 | {"code":"5060292302201","product":{"_id":"5060292302201","_keywords":["snack","food","oil","anything","potato","appetizer","artificial","plant-based","cereal","and","in","popchip","preservative","barbeque","vegetarian","sunflower","chip","frie","potatoe","no","crisp","beverage","salty"],"added_countries_tags":[],"additives_debug_tags":[],"additives_n":2,"additives_old_n":2,"additives_old_tags":["en:e330","en:e160c"],"additives_original_tags":["en:e330","en:e160c"],"additives_prev_original_tags":["en:e330","en:e160c"],"additives_tags":["en:e160c","en:e330"],"additives_tags_n":null,"allergens":"en:milk","allergens_debug_tags":[],"allergens_from_ingredients":"en:milk, milk","allergens_from_user":"(en) en:milk","allergens_hierarchy":["en:milk"],"allergens_tags":["en:milk"],"amino_acids_prev_tags":[],"amino_acids_tags":[],"brands":"Popchips","brands_debug_tags":[],"brands_tags":["popchips"],"carbon_footprint_from_known_ingredients_debug":"en:potato 54% x 0.6 = 32.4 g - ","carbon_footprint_percent_of_known_ingredients":54,"categories":"Plant-based foods and beverages, Plant-based foods, Snacks, Cereals and potatoes, Salty snacks, Appetizers, Chips and fries, Crisps, Potato crisps, Potato crisps in sunflower oil","categories_hierarchy":["en:plant-based-foods-and-beverages","en:plant-based-foods","en:snacks","en:cereals-and-potatoes","en:salty-snacks","en:appetizers","en:chips-and-fries","en:crisps","en:potato-crisps","en:potato-crisps-in-sunflower-oil"],"categories_lc":"en","categories_old":"Plant-based foods and beverages, Plant-based foods, Snacks, Cereals and potatoes, Salty snacks, Appetizers, Chips and fries, Crisps, Potato crisps, Potato crisps in sunflower oil","categories_properties":{"agribalyse_food_code:en":"4004","ciqual_food_code:en":"4004"},"categories_properties_tags":["all-products","categories-known","agribalyse-food-code-4004","agribalyse-food-code-known","agribalyse-proxy-food-code-unknown","ciqual-food-code-4004","ciqual-food-code-known","agribalyse-known","agribalyse-4004"],"categories_tags":["en:plant-based-foods-and-beverages","en:plant-based-foods","en:snacks","en:cereals-and-potatoes","en:salty-snacks","en:appetizers","en:chips-and-fries","en:crisps","en:potato-crisps","en:potato-crisps-in-sunflower-oil"],"category_properties":{"ciqual_food_name:en":"Potato crisps","ciqual_food_name:fr":"Chips de pommes de terre, standard"},"checkers_tags":[],"ciqual_food_name_tags":["potato-crisps"],"cities_tags":[],"code":"5060292302201","codes_tags":["code-13","5060292302xxx","506029230xxxx","50602923xxxxx","5060292xxxxxx","506029xxxxxxx","50602xxxxxxxx","5060xxxxxxxxx","506xxxxxxxxxx","50xxxxxxxxxxx","5xxxxxxxxxxxx"],"compared_to_category":"en:potato-crisps-in-sunflower-oil","complete":0,"completeness":0.8875,"correctors_tags":["tacite","tacite-mass-editor","yuka.VjQwdU5yUUlpdmxUbjhWa3BFenc4ZGt1NDVLUFZtNm9NdWdOSWc9PQ","openfoodfacts-contributors","swipe-studio","yuka.sY2b0xO6T85zoF3NwEKvllZnctbb-gn-LDr4mHzUyem0FYPXMO5by7b5NKg","kiliweb","packbot","foodless","yuka.sY2b0xO6T85zoF3NwEKvlmBZVPXu-gnlBU3miFTQ-NeSIbDaMdUtu4fLGas"],"countries":"France, United Kingdom","countries_debug_tags":[],"countries_hierarchy":["en:france","en:united-kingdom"],"countries_lc":"en","countries_tags":["en:france","en:united-kingdom"],"created_t":1433338177,"creator":"kyzh","data_quality_bugs_tags":[],"data_quality_errors_tags":[],"data_quality_info_tags":["en:packaging-data-incomplete","en:ingredients-percent-analysis-ok","en:carbon-footprint-from-known-ingredients-but-not-from-meat-or-fish","en:ecoscore-extended-data-computed","en:ecoscore-extended-data-less-precise-than-agribalyse","en:food-groups-1-known","en:food-groups-2-known","en:food-groups-3-unknown"],"data_quality_tags":["en:packaging-data-incomplete","en:ingredients-percent-analysis-ok","en:carbon-footprint-from-known-ingredients-but-not-from-meat-or-fish","en:ecoscore-extended-data-computed","en:ecoscore-extended-data-less-precise-than-agribalyse","en:food-groups-1-known","en:food-groups-2-known","en:food-groups-3-unknown","en:nutrition-value-very-low-for-category-energy","en:nutrition-value-very-low-for-category-fat","en:nutrition-value-very-low-for-category-carbohydrates","en:nutrition-value-very-high-for-category-sugars","en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown","en:ecoscore-production-system-no-label"],"data_quality_warnings_tags":["en:nutrition-value-very-low-for-category-energy","en:nutrition-value-very-low-for-category-fat","en:nutrition-value-very-low-for-category-carbohydrates","en:nutrition-value-very-high-for-category-sugars","en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown","en:ecoscore-production-system-no-label"],"data_sources":"App - yuka, Apps, App - Horizon","data_sources_tags":["app-yuka","apps","app-horizon"],"debug_param_sorted_langs":["en","fr"],"ecoscore_data":{"adjustments":{"origins_of_ingredients":{"aggregated_origins":[{"origin":"en:unknown","percent":100}],"epi_score":0,"epi_value":-5,"origins_from_origins_field":["en:unknown"],"transportation_scores":{"ad":0,"al":0,"at":0,"ax":0,"ba":0,"be":0,"bg":0,"ch":0,"cy":0,"cz":0,"de":0,"dk":0,"dz":0,"ee":0,"eg":0,"es":0,"fi":0,"fo":0,"fr":0,"gg":0,"gi":0,"gr":0,"hr":0,"hu":0,"ie":0,"il":0,"im":0,"is":0,"it":0,"je":0,"lb":0,"li":0,"lt":0,"lu":0,"lv":0,"ly":0,"ma":0,"mc":0,"md":0,"me":0,"mk":0,"mt":0,"nl":0,"no":0,"pl":0,"ps":0,"pt":0,"ro":0,"rs":0,"se":0,"si":0,"sj":0,"sk":0,"sm":0,"sy":0,"tn":0,"tr":0,"ua":0,"uk":0,"us":0,"va":0,"world":0,"xk":0},"transportation_values":{"ad":0,"al":0,"at":0,"ax":0,"ba":0,"be":0,"bg":0,"ch":0,"cy":0,"cz":0,"de":0,"dk":0,"dz":0,"ee":0,"eg":0,"es":0,"fi":0,"fo":0,"fr":0,"gg":0,"gi":0,"gr":0,"hr":0,"hu":0,"ie":0,"il":0,"im":0,"is":0,"it":0,"je":0,"lb":0,"li":0,"lt":0,"lu":0,"lv":0,"ly":0,"ma":0,"mc":0,"md":0,"me":0,"mk":0,"mt":0,"nl":0,"no":0,"pl":0,"ps":0,"pt":0,"ro":0,"rs":0,"se":0,"si":0,"sj":0,"sk":0,"sm":0,"sy":0,"tn":0,"tr":0,"ua":0,"uk":0,"us":0,"va":0,"world":0,"xk":0},"values":{"ad":-5,"al":-5,"at":-5,"ax":-5,"ba":-5,"be":-5,"bg":-5,"ch":-5,"cy":-5,"cz":-5,"de":-5,"dk":-5,"dz":-5,"ee":-5,"eg":-5,"es":-5,"fi":-5,"fo":-5,"fr":-5,"gg":-5,"gi":-5,"gr":-5,"hr":-5,"hu":-5,"ie":-5,"il":-5,"im":-5,"is":-5,"it":-5,"je":-5,"lb":-5,"li":-5,"lt":-5,"lu":-5,"lv":-5,"ly":-5,"ma":-5,"mc":-5,"md":-5,"me":-5,"mk":-5,"mt":-5,"nl":-5,"no":-5,"pl":-5,"ps":-5,"pt":-5,"ro":-5,"rs":-5,"se":-5,"si":-5,"sj":-5,"sk":-5,"sm":-5,"sy":-5,"tn":-5,"tr":-5,"ua":-5,"uk":-5,"us":-5,"va":-5,"world":-5,"xk":-5},"warning":"origins_are_100_percent_unknown"},"packaging":{"non_recyclable_and_non_biodegradable_materials":1,"packagings":[{"ecoscore_material_score":0,"ecoscore_shape_ratio":1,"material":"en:plastic","non_recyclable_and_non_biodegradable":"maybe","shape":"en:pack"}],"score":0,"value":-10},"production_system":{"labels":[],"value":0,"warning":"no_label"},"threatened_species":{}},"agribalyse":{"agribalyse_food_code":"4004","co2_agriculture":1.2992636,"co2_consumption":0,"co2_distribution":0.029120657,"co2_packaging":0.28581962,"co2_processing":0.39294234,"co2_total":2.2443641,"co2_transportation":0.23728203,"code":"4004","dqr":"2.45","ef_agriculture":0.18214682,"ef_consumption":0,"ef_distribution":0.0098990521,"ef_packaging":0.021558384,"ef_processing":0.057508389,"ef_total":0.29200269,"ef_transportation":0.020894187,"is_beverage":0,"name_en":"Potato crisps","name_fr":"Chips de pommes de terre, standard","score":78},"grade":"b","grades":{"ad":"b","al":"b","at":"b","ax":"b","ba":"b","be":"b","bg":"b","ch":"b","cy":"b","cz":"b","de":"b","dk":"b","dz":"b","ee":"b","eg":"b","es":"b","fi":"b","fo":"b","fr":"b","gg":"b","gi":"b","gr":"b","hr":"b","hu":"b","ie":"b","il":"b","im":"b","is":"b","it":"b","je":"b","lb":"b","li":"b","lt":"b","lu":"b","lv":"b","ly":"b","ma":"b","mc":"b","md":"b","me":"b","mk":"b","mt":"b","nl":"b","no":"b","pl":"b","ps":"b","pt":"b","ro":"b","rs":"b","se":"b","si":"b","sj":"b","sk":"b","sm":"b","sy":"b","tn":"b","tr":"b","ua":"b","uk":"b","us":"b","va":"b","world":"b","xk":"b"},"missing":{"labels":1,"origins":1},"missing_data_warning":1,"score":63,"scores":{"ad":63,"al":63,"at":63,"ax":63,"ba":63,"be":63,"bg":63,"ch":63,"cy":63,"cz":63,"de":63,"dk":63,"dz":63,"ee":63,"eg":63,"es":63,"fi":63,"fo":63,"fr":63,"gg":63,"gi":63,"gr":63,"hr":63,"hu":63,"ie":63,"il":63,"im":63,"is":63,"it":63,"je":63,"lb":63,"li":63,"lt":63,"lu":63,"lv":63,"ly":63,"ma":63,"mc":63,"md":63,"me":63,"mk":63,"mt":63,"nl":63,"no":63,"pl":63,"ps":63,"pt":63,"ro":63,"rs":63,"se":63,"si":63,"sj":63,"sk":63,"sm":63,"sy":63,"tn":63,"tr":63,"ua":63,"uk":63,"us":63,"va":63,"world":63,"xk":63},"status":"known"},"ecoscore_extended_data":{"impact":{"ef_single_score_log_stddev":0.0664290643574977,"likeliest_impacts":{"Climate_change":0.0835225930657116,"EF_single_score":0.0132996566234689},"likeliest_recipe":{"en:Oak_smoked_sea_salti_yeast_extract":0.103505496656251,"en:e160c":0.10350549665625,"en:e330":0.10350549665625,"en:flavouring":0.10350549665625,"en:garlic_powder":0.103505496656251,"en:milk":1.55847864453775,"en:onion":0.15510736429208,"en:potato":69.2208020730349,"en:potato_starch":10.5320407294931,"en:rice_flour":13.8595510001351,"en:salt":1.3345917157533,"en:spice":0.10350549665625,"en:sugar":10.2883618334396,"en:sunflower_oil":14.1645835312727,"en:tomato_powder":0.10350549665625,"en:water":6.24510964041154,"en:yeast_powder":0.103505496656251},"mass_ratio_uncharacterized":0.0244618467395455,"uncharacterized_ingredients":{"impact":["en:yeast-powder","en:flavouring","en:Oak smoked sea salti yeast extract","en:e160c","en:e330"],"nutrition":["en:flavouring","en:Oak smoked sea salti yeast extract"]},"uncharacterized_ingredients_mass_proportion":{"impact":0.0244618467395455,"nutrition":0.0106506947223728},"uncharacterized_ingredients_ratio":{"impact":0.3125,"nutrition":0.125},"warnings":["Fermentation agents are present in the product (en:yeast-powder). Carbohydrates and sugars mass balance will not be considered to estimate potential recipes","The product has a high number of impact uncharacterized ingredients: 31%"]}},"ecoscore_extended_data_version":"4","ecoscore_grade":"b","ecoscore_score":63,"ecoscore_tags":["b"],"editors":["kyzh","tacite"],"editors_tags":["yuka.VjQwdU5yUUlpdmxUbjhWa3BFenc4ZGt1NDVLUFZtNm9NdWdOSWc9PQ","yuka.sY2b0xO6T85zoF3NwEKvllZnctbb-gn-LDr4mHzUyem0FYPXMO5by7b5NKg","tacite","kyzh","foodless","packbot","openfoodfacts-contributors","kiliweb","yuka.sY2b0xO6T85zoF3NwEKvlmBZVPXu-gnlBU3miFTQ-NeSIbDaMdUtu4fLGas","ecoscore-impact-estimator","swipe-studio","tacite-mass-editor"],"emb_codes":"","emb_codes_20141016":"","emb_codes_debug_tags":[],"emb_codes_orig":"","emb_codes_tags":[],"entry_dates_tags":["2015-06-03","2015-06","2015"],"expiration_date":"11/05/2016","expiration_date_debug_tags":[],"food_groups":"en:appetizers","food_groups_tags":["en:salty-snacks","en:appetizers"],"fruits-vegetables-nuts_100g_estimate":0,"generic_name":"","generic_name_en":"","generic_name_en_debug_tags":[],"generic_name_fr":"","generic_name_fr_debug_tags":[],"id":"5060292302201","image_front_small_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.200.jpg","image_front_thumb_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.100.jpg","image_front_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.400.jpg","image_ingredients_small_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.200.jpg","image_ingredients_thumb_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.100.jpg","image_ingredients_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.400.jpg","image_nutrition_small_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.200.jpg","image_nutrition_thumb_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.100.jpg","image_nutrition_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.400.jpg","image_small_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.200.jpg","image_thumb_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.100.jpg","image_url":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.400.jpg","images":{"1":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338177,"uploader":"kyzh"},"2":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338194,"uploader":"kyzh"},"3":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338203,"uploader":"kyzh"},"4":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338215,"uploader":"kyzh"},"5":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338229,"uploader":"kyzh"},"6":{"sizes":{"100":{"h":74,"w":100},"400":{"h":296,"w":400},"full":{"h":1482,"w":2000}},"uploaded_t":1433338245,"uploader":"kyzh"},"7":{"sizes":{"100":{"h":43,"w":100},"400":{"h":171,"w":400},"full":{"h":846,"w":1974}},"uploaded_t":"1508236270","uploader":"kiliweb"},"8":{"sizes":{"100":{"h":100,"w":82},"400":{"h":400,"w":326},"full":{"h":1140,"w":930}},"uploaded_t":1620505759,"uploader":"kiliweb"},"9":{"sizes":{"100":{"h":56,"w":100},"400":{"h":225,"w":400},"full":{"h":569,"w":1011}},"uploaded_t":1656075071,"uploader":"kiliweb"},"front":{"geometry":"1421x1825-0-95","imgid":"1","normalize":"false","rev":"9","sizes":{"100":{"h":100,"w":78},"200":{"h":200,"w":156},"400":{"h":400,"w":311},"full":{"h":1825,"w":1421}},"white_magic":"true"},"front_en":{"angle":0,"coordinates_image_size":"full","geometry":"0x0--1--1","imgid":"8","normalize":null,"rev":"23","sizes":{"100":{"h":100,"w":82},"200":{"h":200,"w":163},"400":{"h":400,"w":326},"full":{"h":1140,"w":930}},"white_magic":null,"x1":"-1","x2":"-1","y1":"-1","y2":"-1"},"ingredients":{"geometry":"1730x526-125-304","imgid":"5","normalize":"false","ocr":1,"orientation":"0","rev":"11","sizes":{"100":{"h":30,"w":100},"200":{"h":61,"w":200},"400":{"h":122,"w":400},"full":{"h":526,"w":1730}},"white_magic":"false"},"ingredients_en":{"geometry":"1730x526-125-304","imgid":"5","normalize":"false","ocr":1,"orientation":"0","rev":"11","sizes":{"100":{"h":30,"w":100},"200":{"h":61,"w":200},"400":{"h":122,"w":400},"full":{"h":526,"w":1730}},"white_magic":"false"},"nutrition":{"geometry":"1131x920-150-794","imgid":"3","normalize":"false","ocr":1,"orientation":"0","rev":"10","sizes":{"100":{"h":81,"w":100},"200":{"h":163,"w":200},"400":{"h":325,"w":400},"full":{"h":920,"w":1131}},"white_magic":"false"},"nutrition_en":{"angle":0,"coordinates_image_size":"full","geometry":"0x0--1--1","imgid":"9","normalize":null,"rev":"32","sizes":{"100":{"h":56,"w":100},"200":{"h":113,"w":200},"400":{"h":225,"w":400},"full":{"h":569,"w":1011}},"white_magic":null,"x1":"-1","x2":"-1","y1":"-1","y2":"-1"}},"informers_tags":["kyzh","tacite","tacite-mass-editor","yuka.VjQwdU5yUUlpdmxUbjhWa3BFenc4ZGt1NDVLUFZtNm9NdWdOSWc9PQ","openfoodfacts-contributors"],"ingredients":[{"id":"en:potato","percent":54,"percent_estimate":54,"percent_max":54,"percent_min":54,"processing":"en:dried","rank":1,"text":"potatoes","vegan":"yes","vegetarian":"yes"},{"from_palm_oil":"no","id":"en:sunflower-oil","percent_estimate":28.75,"percent_max":46,"percent_min":11.5,"rank":2,"text":"sunflower oil","vegan":"yes","vegetarian":"yes"},{"has_sub_ingredients":"yes","id":"en:coating","percent_estimate":8.625,"percent_max":33.3333333333333,"percent_min":0,"rank":3,"text":"seasoning","vegan":"ignore","vegetarian":"ignore"},{"id":"en:rice-flour","percent_estimate":4.3125,"percent_max":17.25,"percent_min":0,"rank":4,"text":"rice flour","vegan":"yes","vegetarian":"yes"},{"id":"en:potato-starch","percent_estimate":4.3125,"percent_max":11.5,"percent_min":0,"rank":5,"text":"potato starch","vegan":"yes","vegetarian":"yes"},{"id":"en:sugar","percent_estimate":4.3125,"percent_max":33.3333333333333,"percent_min":0,"text":"sugar","vegan":"yes","vegetarian":"yes"},{"has_sub_ingredients":"yes","id":"en:whey-powder","percent_estimate":2.15625,"percent_max":16.6666666666667,"percent_min":0,"text":"whey powder","vegan":"no","vegetarian":"maybe"},{"id":"en:salt","percent_estimate":1.078125,"percent_max":11.1111111111111,"percent_min":0,"text":"salt","vegan":"yes","vegetarian":"yes"},{"id":"en:onion","percent_estimate":0.5390625,"percent_max":8.33333333333333,"percent_min":0,"processing":"en:powder","text":"onion","vegan":"yes","vegetarian":"yes"},{"id":"en:yeast-powder","percent_estimate":0.26953125,"percent_max":6.66666666666667,"percent_min":0,"text":"yeast powder","vegan":"yes","vegetarian":"yes"},{"id":"en:garlic-powder","percent_estimate":0.134765625,"percent_max":5.55555555555556,"percent_min":0,"text":"garlic powder","vegan":"yes","vegetarian":"yes"},{"id":"en:tomato-powder","percent_estimate":0.0673828125,"percent_max":4.76190476190476,"percent_min":0,"text":"tomato powder","vegan":"yes","vegetarian":"yes"},{"id":"en:Oak smoked sea salti yeast extract","percent_estimate":0.03369140625,"percent_max":4.16666666666667,"percent_min":0,"text":"Oak smoked sea salti yeast extract"},{"id":"en:flavouring","percent_estimate":0.016845703125,"percent_max":3.7037037037037,"percent_min":0,"text":"flavourings","vegan":"maybe","vegetarian":"maybe"},{"id":"en:spice","percent_estimate":0.0084228515625,"percent_max":3.33333333333333,"percent_min":0,"text":"spices","vegan":"yes","vegetarian":"yes"},{"has_sub_ingredients":"yes","id":"en:acid","percent_estimate":0.00421142578125,"percent_max":3.03030303030303,"percent_min":0,"text":"acid"},{"has_sub_ingredients":"yes","id":"en:colour","percent_estimate":0.00421142578125,"percent_max":2.77777777777778,"percent_min":0,"text":"colour"},{"id":"en:milk","percent_estimate":2.15625,"percent_max":16.6666666666667,"percent_min":0,"text":"milk","vegan":"no","vegetarian":"yes"},{"id":"en:e330","percent_estimate":0.00421142578125,"percent_max":3.03030303030303,"percent_min":0,"text":"citric acid","vegan":"yes","vegetarian":"yes"},{"id":"en:e160c","percent_estimate":0.00421142578125,"percent_max":2.77777777777778,"percent_min":0,"text":"paprika extract","vegan":"yes","vegetarian":"yes"}],"ingredients_analysis":{"en:non-vegan":["en:whey-powder","en:milk"],"en:palm-oil-content-unknown":["en:Oak smoked sea salti yeast extract"],"en:vegan-status-unknown":["en:Oak smoked sea salti yeast extract"],"en:vegetarian-status-unknown":["en:Oak smoked sea salti yeast extract"]},"ingredients_analysis_tags":["en:palm-oil-free","en:non-vegan","en:vegetarian"],"ingredients_debug":["54% dried potatoes",",",null,null,null," sunflower oil",",",null,null,null," seasoning ","(","(",null,null,"sugar",",",null,null,null," whey powder ","[","[",null,null,"milk]",",",null,null,null," salt",",",null,null,null," onion powder",",",null,null,null," yeast powder",",",null,null,null," garlic powder",",",null,null,null," tomato powder",",",null,null,null," Oak smoked sea salti yeast extract",",",null,null,null," flavourings",",",null,null,null," spices",",",null,null,null," acid",":",":",null,null," citric acid",",",null,null,null," colour",":",":",null,null," paprika extract)",",",null,null,null," rice flour",",",null,null,null," potato starch."],"ingredients_from_or_that_may_be_from_palm_oil_n":0,"ingredients_from_palm_oil_n":0,"ingredients_from_palm_oil_tags":[],"ingredients_hierarchy":["en:potato","en:vegetable","en:root-vegetable","en:sunflower-oil","en:oil-and-fat","en:vegetable-oil-and-fat","en:vegetable-oil","en:coating","en:rice-flour","en:flour","en:rice","en:potato-starch","en:starch","en:sugar","en:added-sugar","en:disaccharide","en:whey-powder","en:dairy","en:whey","en:salt","en:onion","en:yeast-powder","en:yeast","en:garlic-powder","en:garlic","en:tomato-powder","en:tomato","en:Oak smoked sea salti yeast extract","en:flavouring","en:spice","en:condiment","en:acid","en:colour","en:milk","en:e330","en:e160c"],"ingredients_ids_debug":["54-dried-potatoes","sunflower-oil","seasoning","sugar","whey-powder","milk","salt","onion-powder","yeast-powder","garlic-powder","tomato-powder","oak-smoked-sea-salti-yeast-extract","flavourings","spices","acid","citric-acid","colour","paprika-extract","rice-flour","potato-starch"],"ingredients_n":20,"ingredients_n_tags":["20","11-20"],"ingredients_original_tags":["en:potato","en:sunflower-oil","en:coating","en:rice-flour","en:potato-starch","en:sugar","en:whey-powder","en:salt","en:onion","en:yeast-powder","en:garlic-powder","en:tomato-powder","en:Oak smoked sea salti yeast extract","en:flavouring","en:spice","en:acid","en:colour","en:milk","en:e330","en:e160c"],"ingredients_percent_analysis":1,"ingredients_tags":["en:potato","en:vegetable","en:root-vegetable","en:sunflower-oil","en:oil-and-fat","en:vegetable-oil-and-fat","en:vegetable-oil","en:coating","en:rice-flour","en:flour","en:rice","en:potato-starch","en:starch","en:sugar","en:added-sugar","en:disaccharide","en:whey-powder","en:dairy","en:whey","en:salt","en:onion","en:yeast-powder","en:yeast","en:garlic-powder","en:garlic","en:tomato-powder","en:tomato","en:oak-smoked-sea-salti-yeast-extract","en:flavouring","en:spice","en:condiment","en:acid","en:colour","en:milk","en:e330","en:e160c"],"ingredients_text":"54% dried potatoes, sunflower oil, seasoning (sugar, whey powder [milk], salt, onion powder, yeast powder, garlic powder, tomato powder, Oak smoked sea salti yeast extract, flavourings, spices, acid: citric acid, colour: paprika extract), rice flour, potato starch.","ingredients_text_debug":"54% dried potatoes, sunflower oil, seasoning (sugar, whey powder [milk], salt, onion powder, yeast powder, garlic powder, tomato powder, Oak smoked sea salti yeast extract, flavourings, spices, acid: citric acid, colour: paprika extract), rice flour, potato starch.","ingredients_text_debug_tags":[],"ingredients_text_en":"54% dried potatoes, sunflower oil, seasoning (sugar, whey powder [milk], salt, onion powder, yeast powder, garlic powder, tomato powder, Oak smoked sea salti yeast extract, flavourings, spices, acid: citric acid, colour: paprika extract), rice flour, potato starch.","ingredients_text_fr":"","ingredients_text_fr_debug_tags":[],"ingredients_text_with_allergens":"54% dried potatoes, sunflower oil, seasoning (sugar, whey powder [milk], salt, onion powder, yeast powder, garlic powder, tomato powder, Oak smoked sea salti yeast extract, flavourings, spices, acid: citric acid, colour: paprika extract), rice flour, potato starch.","ingredients_text_with_allergens_en":"54% dried potatoes, sunflower oil, seasoning (sugar, whey powder [milk], salt, onion powder, yeast powder, garlic powder, tomato powder, Oak smoked sea salti yeast extract, flavourings, spices, acid: citric acid, colour: paprika extract), rice flour, potato starch.","ingredients_that_may_be_from_palm_oil_n":0,"ingredients_that_may_be_from_palm_oil_tags":[],"ingredients_with_specified_percent_n":1,"ingredients_with_specified_percent_sum":54,"ingredients_with_unspecified_percent_n":15,"ingredients_with_unspecified_percent_sum":46,"interface_version_created":"20120622","interface_version_modified":"20150316.jqm2","known_ingredients_n":35,"labels":"Vegetarian, No preservatives, No artificial anything","labels_hierarchy":["en:vegetarian","en:no-preservatives","en:No artificial anything"],"labels_lc":"en","labels_old":"Vegetarian, No preservatives, No artificial anything","labels_tags":["en:vegetarian","en:no-preservatives","en:no-artificial-anything"],"lang":"en","lang_debug_tags":[],"languages":{"en:english":5},"languages_codes":{"en":5},"languages_hierarchy":["en:english"],"languages_tags":["en:english","en:1"],"last_edit_dates_tags":["2022-06-24","2022-06","2022"],"last_editor":"kiliweb","last_image_dates_tags":["2022-06-24","2022-06","2022"],"last_image_t":1656075071,"last_modified_by":"kiliweb","last_modified_t":1656075071,"lc":"en","link":"","link_debug_tags":[],"main_countries_tags":[],"manufacturing_places":"European Union","manufacturing_places_debug_tags":[],"manufacturing_places_tags":["european-union"],"max_imgid":"9","minerals_prev_tags":[],"minerals_tags":[],"misc_tags":["en:nutrition-fruits-vegetables-nuts-estimate-from-ingredients","en:nutrition-all-nutriscore-values-known","en:nutriscore-computed","en:ecoscore-extended-data-computed","en:ecoscore-extended-data-version-4","en:ecoscore-missing-data-warning","en:ecoscore-missing-data-labels","en:ecoscore-missing-data-origins","en:ecoscore-computed","en:main-countries-fr-product-name-not-in-country-language","en:main-countries-fr-ingredients-not-in-country-language","en:main-countries-fr-no-data-in-country-language"],"no_nutrition_data":"","nova_group":4,"nova_group_debug":"","nova_groups":"4","nova_groups_markers":{"3":[["categories","en:salty-snacks"],["ingredients","en:salt"],["ingredients","en:starch"],["ingredients","en:sugar"],["ingredients","en:vegetable-oil"]],"4":[["additives","en:e160c"],["ingredients","en:colour"],["ingredients","en:flavouring"],["ingredients","en:whey"]]},"nova_groups_tags":["en:4-ultra-processed-food-and-drink-products"],"nucleotides_prev_tags":[],"nucleotides_tags":[],"nutrient_levels":{"fat":"moderate","salt":"high","saturated-fat":"low","sugars":"moderate"},"nutrient_levels_tags":["en:fat-in-moderate-quantity","en:saturated-fat-in-low-quantity","en:sugars-in-moderate-quantity","en:salt-in-high-quantity"],"nutriments":{"carbohydrates":15,"carbohydrates_100g":15,"carbohydrates_serving":3.45,"carbohydrates_unit":"g","carbohydrates_value":15,"carbon-footprint-from-known-ingredients_100g":32.4,"carbon-footprint-from-known-ingredients_product":7.45,"carbon-footprint-from-known-ingredients_serving":7.45,"energy":1757,"energy-kcal":420,"energy-kcal_100g":420,"energy-kcal_serving":96.6,"energy-kcal_unit":"kcal","energy-kcal_value":420,"energy_100g":1757,"energy_serving":404,"energy_unit":"kcal","energy_value":420,"fat":15,"fat_100g":15,"fat_serving":3.45,"fat_unit":"g","fat_value":15,"fiber":3.9,"fiber_100g":3.9,"fiber_serving":0.897,"fiber_unit":"g","fiber_value":3.9,"fruits-vegetables-nuts-estimate-from-ingredients_100g":0,"fruits-vegetables-nuts-estimate-from-ingredients_serving":0,"nova-group":4,"nova-group_100g":4,"nova-group_serving":4,"nutrition-score-fr":12,"nutrition-score-fr_100g":12,"proteins":5.7,"proteins_100g":5.7,"proteins_serving":1.31,"proteins_unit":"g","proteins_value":5.7,"salt":2.1,"salt_100g":2.1,"salt_serving":0.483,"salt_unit":"g","salt_value":2.1,"saturated-fat":1.4,"saturated-fat_100g":1.4,"saturated-fat_serving":0.322,"saturated-fat_unit":"g","saturated-fat_value":1.4,"sodium":0.84,"sodium_100g":0.84,"sodium_serving":0.193,"sodium_unit":"g","sodium_value":0.84,"sugars":8.7,"sugars_100g":8.7,"sugars_serving":2,"sugars_unit":"g","sugars_value":8.7},"nutriscore_data":{"energy":1757,"energy_points":5,"energy_value":1757,"fiber":3.9,"fiber_points":4,"fiber_value":3.9,"fruits_vegetables_nuts_colza_walnut_olive_oils":0,"fruits_vegetables_nuts_colza_walnut_olive_oils_points":0,"fruits_vegetables_nuts_colza_walnut_olive_oils_value":0,"grade":"d","is_beverage":0,"is_cheese":0,"is_fat":0,"is_water":0,"negative_points":16,"positive_points":4,"proteins":5.7,"proteins_points":3,"proteins_value":5.7,"saturated_fat":1.4,"saturated_fat_points":1,"saturated_fat_ratio":9.33333333333333,"saturated_fat_ratio_points":0,"saturated_fat_ratio_value":9.3,"saturated_fat_value":1.4,"score":12,"sodium":840,"sodium_points":9,"sodium_value":840,"sugars":8.7,"sugars_points":1,"sugars_value":8.7},"nutriscore_grade":"d","nutriscore_score":12,"nutriscore_score_opposite":-12,"nutrition_data":"on","nutrition_data_per":"100g","nutrition_data_prepared":"","nutrition_data_prepared_per":"100g","nutrition_data_prepared_per_debug_tags":[],"nutrition_grade_fr":"d","nutrition_grades":"d","nutrition_grades_tags":["d"],"nutrition_score_beverage":0,"nutrition_score_debug":"","nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients":1,"nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value":0,"origins":"","origins_hierarchy":[],"origins_lc":"en","origins_old":"","origins_tags":[],"other_nutritional_substances_tags":[],"packaging":"Plastic, en:mixed plastic film-packet","packaging_hierarchy":["en:plastic","en:mixed plastic film-packet"],"packaging_lc":"en","packaging_old":"Plastic, Mixed plastic-packet","packaging_old_before_taxonomization":"Plastic, en:mixed plastic-packet","packaging_tags":["en:plastic","en:mixed-plastic-film-packet"],"packagings":[{"material":"en:plastic","shape":"en:pack"}],"photographers_tags":["kyzh","kiliweb"],"pnns_groups_1":"Salty snacks","pnns_groups_1_tags":["salty-snacks","known"],"pnns_groups_2":"Appetizers","pnns_groups_2_tags":["appetizers","known"],"popularity_key":20900000020,"popularity_tags":["bottom-25-percent-scans-2019","bottom-20-percent-scans-2019","bottom-15-percent-scans-2019","top-90-percent-scans-2019","top-10000-gb-scans-2019","top-50000-gb-scans-2019","top-100000-gb-scans-2019","top-country-gb-scans-2019","bottom-25-percent-scans-2020","top-80-percent-scans-2020","top-85-percent-scans-2020","top-90-percent-scans-2020","top-5000-gb-scans-2020","top-10000-gb-scans-2020","top-50000-gb-scans-2020","top-100000-gb-scans-2020","top-country-gb-scans-2020","top-100000-scans-2021","at-least-5-scans-2021","top-75-percent-scans-2021","top-80-percent-scans-2021","top-85-percent-scans-2021","top-90-percent-scans-2021","top-5000-gb-scans-2021","top-10000-gb-scans-2021","top-50000-gb-scans-2021","top-100000-gb-scans-2021","top-country-gb-scans-2021","at-least-5-gb-scans-2021","top-5000-ie-scans-2021","top-10000-ie-scans-2021","top-50000-ie-scans-2021","top-100000-ie-scans-2021","top-1000-mu-scans-2021","top-5000-mu-scans-2021","top-10000-mu-scans-2021","top-50000-mu-scans-2021","top-100000-mu-scans-2021"],"product_name":"Barbeque Potato Chips","product_name_en":"Barbeque Potato Chips","product_name_fr":"","product_name_fr_debug_tags":[],"product_quantity":"23","purchase_places":"","purchase_places_debug_tags":[],"purchase_places_tags":[],"quantity":"23 g","quantity_debug_tags":[],"removed_countries_tags":[],"rev":32,"scans_n":10,"selected_images":{"front":{"display":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.400.jpg"},"small":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.200.jpg"},"thumb":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/front_en.23.100.jpg"}},"ingredients":{"display":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.400.jpg"},"small":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.200.jpg"},"thumb":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/ingredients_en.11.100.jpg"}},"nutrition":{"display":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.400.jpg"},"small":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.200.jpg"},"thumb":{"en":"https://images.openfoodfacts.org/images/products/506/029/230/2201/nutrition_en.32.100.jpg"}}},"serving_quantity":"23","serving_size":"23 g","serving_size_debug_tags":[],"sortkey":1535456524,"states":"en:to-be-completed, en:nutrition-facts-completed, en:ingredients-completed, en:expiration-date-completed, en:packaging-code-to-be-completed, en:characteristics-to-be-completed, en:origins-to-be-completed, en:categories-completed, en:brands-completed, en:packaging-completed, en:quantity-completed, en:product-name-completed, en:photos-to-be-validated, en:packaging-photo-to-be-selected, en:nutrition-photo-selected, en:ingredients-photo-selected, en:front-photo-selected, en:photos-uploaded","states_hierarchy":["en:to-be-completed","en:nutrition-facts-completed","en:ingredients-completed","en:expiration-date-completed","en:packaging-code-to-be-completed","en:characteristics-to-be-completed","en:origins-to-be-completed","en:categories-completed","en:brands-completed","en:packaging-completed","en:quantity-completed","en:product-name-completed","en:photos-to-be-validated","en:packaging-photo-to-be-selected","en:nutrition-photo-selected","en:ingredients-photo-selected","en:front-photo-selected","en:photos-uploaded"],"states_tags":["en:to-be-completed","en:nutrition-facts-completed","en:ingredients-completed","en:expiration-date-completed","en:packaging-code-to-be-completed","en:characteristics-to-be-completed","en:origins-to-be-completed","en:categories-completed","en:brands-completed","en:packaging-completed","en:quantity-completed","en:product-name-completed","en:photos-to-be-validated","en:packaging-photo-to-be-selected","en:nutrition-photo-selected","en:ingredients-photo-selected","en:front-photo-selected","en:photos-uploaded"],"stores":"","stores_debug_tags":[],"stores_tags":[],"teams":"swipe-studio","teams_tags":["swipe-studio"],"traces":"","traces_debug_tags":[],"traces_from_ingredients":"","traces_from_user":"(en) ","traces_hierarchy":[],"traces_tags":[],"unique_scans_n":8,"unknown_ingredients_n":1,"unknown_nutrients_tags":[],"update_key":"ingredients20220627","vitamins_prev_tags":[],"vitamins_tags":[]},"status":1,"status_verbose":"product found"} -------------------------------------------------------------------------------- /sample/multidim_arr.json: -------------------------------------------------------------------------------- 1 | {"arr":[null,false,1.2,{"a":1,"b":"Hello"},"World",[1,false,"Sample"]]} -------------------------------------------------------------------------------- /sample/random.json: -------------------------------------------------------------------------------- 1 | {"status":"ok","data":{"calories":500,"items":[{"id":1,"name":"Apple","quantity":8},{"id":2,"name":"Beef Steak 100g","quantity":2}]},"extra":{},"tags":["min"]} -------------------------------------------------------------------------------- /sample/reddit.json: -------------------------------------------------------------------------------- 1 | {"kind":"Listing","data":{"after":"t3_vupezm","dist":25,"modhash":"","geo_filter":null,"children":[{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_kd70n75e","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL in the late 1990s, a cattle farmer was clearing land on his Texas ranch and decided to write his name in kilometer-tall letters, producing the worlds largest signature. NASA uses it to evaluate the resolution of cameras on satellites and the ISS.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":100,"top_awarded_type":null,"hide_score":false,"name":"t3_vvhret","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.95,"author_flair_background_color":null,"subreddit_type":"public","ups":31310,"total_awards_received":2,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":31310,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":true,"thumbnail":"https://a.thumbs.redditmedia.com/XnluX4TR5-EC03Tdf5AuYS_6dshGx-uAdkFSsFGobm8.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{"gid_1":1},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657421323,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"odditycentral.com","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.odditycentral.com/travel/how-the-worlds-largest-signature-is-used-by-nasa-to-analyze-satellite-imagery.html","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/AVorKgkWfLyL_Ny8TJ3c9D8_BvIpnrvbAfW0cK5A33g.jpg?auto=webp&s=6c8804e3beb0880130d258d40562170de89c13d0","width":750,"height":540},"resolutions":[{"url":"https://external-preview.redd.it/AVorKgkWfLyL_Ny8TJ3c9D8_BvIpnrvbAfW0cK5A33g.jpg?width=108&crop=smart&auto=webp&s=53d93e651264c735ac453256a0ad617375cc6040","width":108,"height":77},{"url":"https://external-preview.redd.it/AVorKgkWfLyL_Ny8TJ3c9D8_BvIpnrvbAfW0cK5A33g.jpg?width=216&crop=smart&auto=webp&s=81c5fbda69cad9160c5e114cfd58ec6347dc9673","width":216,"height":155},{"url":"https://external-preview.redd.it/AVorKgkWfLyL_Ny8TJ3c9D8_BvIpnrvbAfW0cK5A33g.jpg?width=320&crop=smart&auto=webp&s=a2479ee48c2dfbbad345923185ff3c0a51669e89","width":320,"height":230},{"url":"https://external-preview.redd.it/AVorKgkWfLyL_Ny8TJ3c9D8_BvIpnrvbAfW0cK5A33g.jpg?width=640&crop=smart&auto=webp&s=88073c327dcda6fff9bc472aa2d41c942e37e55b","width":640,"height":460}],"variants":{},"id":"Wz-qQcqtdsJFyltSQz8Bw1awIbFgXjOjbjdqM1R-s_k"}],"enabled":false},"all_awardings":[{"giver_coin_reward":null,"subreddit_id":null,"is_new":false,"days_of_drip_extension":null,"coin_price":100,"id":"gid_1","penny_donate":null,"award_sub_type":"GLOBAL","coin_reward":0,"icon_url":"https://www.redditstatic.com/gold/awards/icon/silver_512.png","days_of_premium":null,"tiers_by_required_awardings":null,"resized_icons":[{"url":"https://www.redditstatic.com/gold/awards/icon/silver_16.png","width":16,"height":16},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_32.png","width":32,"height":32},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_48.png","width":48,"height":48},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_64.png","width":64,"height":64},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_128.png","width":128,"height":128}],"icon_width":512,"static_icon_width":512,"start_date":null,"is_enabled":true,"awardings_required_to_grant_benefits":null,"description":"Shows the Silver Award... and that's it.","end_date":null,"sticky_duration_seconds":null,"subreddit_coin_reward":0,"count":1,"static_icon_height":512,"name":"Silver","resized_static_icons":[{"url":"https://www.redditstatic.com/gold/awards/icon/silver_16.png","width":16,"height":16},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_32.png","width":32,"height":32},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_48.png","width":48,"height":48},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_64.png","width":64,"height":64},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_128.png","width":128,"height":128}],"icon_format":null,"icon_height":512,"penny_price":null,"award_type":"global","static_icon_url":"https://www.redditstatic.com/gold/awards/icon/silver_512.png"},{"giver_coin_reward":null,"subreddit_id":null,"is_new":false,"days_of_drip_extension":null,"coin_price":125,"id":"award_5f123e3d-4f48-42f4-9c11-e98b566d5897","penny_donate":null,"award_sub_type":"GLOBAL","coin_reward":0,"icon_url":"https://i.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png","days_of_premium":null,"tiers_by_required_awardings":null,"resized_icons":[{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=16&height=16&auto=webp&s=92932f465d58e4c16b12b6eac4ca07d27e3d11c0","width":16,"height":16},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=32&height=32&auto=webp&s=d11484a208d68a318bf9d4fcf371171a1cb6a7ef","width":32,"height":32},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=48&height=48&auto=webp&s=febdf28b6f39f7da7eb1365325b85e0bb49a9f63","width":48,"height":48},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=64&height=64&auto=webp&s=b4406a2d88bf86fa3dc8a45aacf7e0c7bdccc4fb","width":64,"height":64},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=128&height=128&auto=webp&s=19555b13e3e196b62eeb9160d1ac1d1b372dcb0b","width":128,"height":128}],"icon_width":2048,"static_icon_width":2048,"start_date":null,"is_enabled":true,"awardings_required_to_grant_benefits":null,"description":"When you come across a feel-good thing.","end_date":null,"sticky_duration_seconds":null,"subreddit_coin_reward":0,"count":1,"static_icon_height":2048,"name":"Wholesome","resized_static_icons":[{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=16&height=16&auto=webp&s=92932f465d58e4c16b12b6eac4ca07d27e3d11c0","width":16,"height":16},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=32&height=32&auto=webp&s=d11484a208d68a318bf9d4fcf371171a1cb6a7ef","width":32,"height":32},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=48&height=48&auto=webp&s=febdf28b6f39f7da7eb1365325b85e0bb49a9f63","width":48,"height":48},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=64&height=64&auto=webp&s=b4406a2d88bf86fa3dc8a45aacf7e0c7bdccc4fb","width":64,"height":64},{"url":"https://preview.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png?width=128&height=128&auto=webp&s=19555b13e3e196b62eeb9160d1ac1d1b372dcb0b","width":128,"height":128}],"icon_format":null,"icon_height":2048,"penny_price":null,"award_type":"global","static_icon_url":"https://i.redd.it/award_images/t5_22cerq/5izbv4fn0md41_Wholesome.png"}],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvhret","is_robot_indexable":true,"report_reasons":null,"author":"Abhirup_0","discussion_type":null,"num_comments":444,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvhret/til_in_the_late_1990s_a_cattle_farmer_was/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.odditycentral.com/travel/how-the-worlds-largest-signature-is-used-by-nasa-to-analyze-satellite-imagery.html","subreddit_subscribers":28095064,"created_utc":1657421323,"num_crossposts":4,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_12na7v","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL a NASA physicist fought his HOA in court for 7 years when they required him to buy a $500 mailbox","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":78,"top_awarded_type":null,"hide_score":true,"name":"t3_vvu7wv","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.97,"author_flair_background_color":null,"subreddit_type":"public","ups":385,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":385,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/4BkZZGhEpJxGTKRQtmjFq8UUrN8IYmg1Qaq9JydsSa4.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657467907,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"news.yahoo.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://news.yahoo.com/man-battles-hoa-7-years-050000017.html","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?auto=webp&s=714b56c9b0c4b44c4315dc4f41de4cd3c479ff32","width":1200,"height":675},"resolutions":[{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=108&crop=smart&auto=webp&s=54d4cb8c86802b49593137930c7b090470ebe38b","width":108,"height":60},{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=216&crop=smart&auto=webp&s=ee681e250ca035d73b4d51aad9fd5dad41c855b5","width":216,"height":121},{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=320&crop=smart&auto=webp&s=1a1ccb1dc656b60f24b233cdfab04a194790a741","width":320,"height":180},{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=640&crop=smart&auto=webp&s=cdff18015c36311dcabcd57da6628d7dbcd5b740","width":640,"height":360},{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=960&crop=smart&auto=webp&s=07f82ed2b44735577047a89b4d345137c7da7a2e","width":960,"height":540},{"url":"https://external-preview.redd.it/nKnG6CKYJ73FqXEOv2jVOlW3bDQd2SdeiAv2yA5XZxE.jpg?width=1080&crop=smart&auto=webp&s=d95608ee61424cbb5e550be069e5a46aaa2b4e6b","width":1080,"height":607}],"variants":{},"id":"f83I4miVfReqLaxfx855vMWwsRgSJjNUoBgw_3nrx-g"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvu7wv","is_robot_indexable":true,"report_reasons":null,"author":"homerjay42","discussion_type":null,"num_comments":61,"send_replies":false,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvu7wv/til_a_nasa_physicist_fought_his_hoa_in_court_for/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://news.yahoo.com/man-battles-hoa-7-years-050000017.html","subreddit_subscribers":28095064,"created_utc":1657467907,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_5b9huic0","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL about Delhi’s Sabharwal family has got the rare distinction of being the only family where every single member is a doctor for the past five generations.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":136,"top_awarded_type":null,"hide_score":false,"name":"t3_vvmdzm","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.9,"author_flair_background_color":null,"subreddit_type":"public","ups":997,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":997,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/kYFkMimDnPr97P3DieL-KB3IxfQ4Ee3c9uV3hgZOgUc.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657438826,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"indiabookofrecords.in","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://indiabookofrecords.in/140-doctors-in-a-family/","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/WmLKJPXixDhkJvC0eWRXvfmbkeM1LwRcLdR4ZUztbpE.jpg?auto=webp&s=cb047ed5ea8257016668f0c6d085d90f16aa57b9","width":300,"height":293},"resolutions":[{"url":"https://external-preview.redd.it/WmLKJPXixDhkJvC0eWRXvfmbkeM1LwRcLdR4ZUztbpE.jpg?width=108&crop=smart&auto=webp&s=6ad6368cf87f725eb0c1836ec9b6044b7d2f52d8","width":108,"height":105},{"url":"https://external-preview.redd.it/WmLKJPXixDhkJvC0eWRXvfmbkeM1LwRcLdR4ZUztbpE.jpg?width=216&crop=smart&auto=webp&s=9e8f2d2d659591b22192020fb37859628d7195ac","width":216,"height":210}],"variants":{},"id":"f7hs3lU7IRUdrtM1YnFwAjeHLXlDopCSg1pKDIe_WY0"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvmdzm","is_robot_indexable":true,"report_reasons":null,"author":"avoosin","discussion_type":null,"num_comments":70,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvmdzm/til_about_delhis_sabharwal_family_has_got_the/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://indiabookofrecords.in/140-doctors-in-a-family/","subreddit_subscribers":28095064,"created_utc":1657438826,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_izsvoc0v","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that Mummy Brown was a pigment used by European painters that was made from the flesh of Egyptian mummies. It was also common to export mummies from Egypt to Europe to be ground up and consumed as “medicine”","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":140,"top_awarded_type":null,"hide_score":true,"name":"t3_vvt0by","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.93,"author_flair_background_color":null,"subreddit_type":"public","ups":231,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":231,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/r24FaTEJsoQB7ZNpktmV-s2HjzeSYqfOCUebzJYUk3Q.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657464389,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"artinsociety.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.artinsociety.com/the-life-and-death-of-mummy-brown.html","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/1SjFtpkzvpOz-auWbPDN-OvNVXyLJZGXhGBFR3pb4EY.jpg?auto=webp&s=55b89808cf2781fb6f7e3ab27b537b8d19b357ce","width":388,"height":479},"resolutions":[{"url":"https://external-preview.redd.it/1SjFtpkzvpOz-auWbPDN-OvNVXyLJZGXhGBFR3pb4EY.jpg?width=108&crop=smart&auto=webp&s=dda313c86ceafe638e3c3a977b9d40b4c5bb0017","width":108,"height":133},{"url":"https://external-preview.redd.it/1SjFtpkzvpOz-auWbPDN-OvNVXyLJZGXhGBFR3pb4EY.jpg?width=216&crop=smart&auto=webp&s=1f5d2808a2bc170e67eac146ff4a5ad10a2ccd6f","width":216,"height":266},{"url":"https://external-preview.redd.it/1SjFtpkzvpOz-auWbPDN-OvNVXyLJZGXhGBFR3pb4EY.jpg?width=320&crop=smart&auto=webp&s=a81bf09b5b540805f841fbb682f316765b5a2189","width":320,"height":395}],"variants":{},"id":"i8UCuttNzO338jfLr-rraNvu3JRo9533ndUIS3IKv4I"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvt0by","is_robot_indexable":true,"report_reasons":null,"author":"aprettyp","discussion_type":null,"num_comments":18,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvt0by/til_that_mummy_brown_was_a_pigment_used_by/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.artinsociety.com/the-life-and-death-of-mummy-brown.html","subreddit_subscribers":28095064,"created_utc":1657464389,"num_crossposts":1,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_cv21o54a","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL about “The Jalen Generation”. 90’s and 2000’s NBA star Jalen Rose got his name when his mom combined James and Leonard together. There were no other Jalens at the time, but because of Rose’s popularity currently over 30 athletes with versions of the name Jalen are playing in the NBA and NFL.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":78,"top_awarded_type":null,"hide_score":true,"name":"t3_vvsp49","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.9,"author_flair_background_color":null,"subreddit_type":"public","ups":177,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":177,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/Ia7TUQex-ZNrpmx2MzlB-bhwOG-vRrrmQRWOBEjQBw0.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657463459,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"espn.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.espn.com/nba/story/_/id/31309206/the-jalen-generation-how-jalen-rose-name-spread-world-sports","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?auto=webp&s=27187d03c2b62dd30e16e91e9ea2dedbbc99691f","width":1296,"height":729},"resolutions":[{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=108&crop=smart&auto=webp&s=045f73e12acf647fabcbdd5f3c07a19611ccef4e","width":108,"height":60},{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=216&crop=smart&auto=webp&s=0ead11b750f630ce1a0dae9f1a17e289e1c88c65","width":216,"height":121},{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=320&crop=smart&auto=webp&s=f43bd15e98481fbd695f65ccf5f4bbbd76cf14f1","width":320,"height":180},{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=640&crop=smart&auto=webp&s=a0f72b3449588a9eec0b3aae3ea84c37011224a5","width":640,"height":360},{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=960&crop=smart&auto=webp&s=a363aeccdaa27057ef11306306c737b7c8de0969","width":960,"height":540},{"url":"https://external-preview.redd.it/T1Lj1zp_p0oddzF8fay_bCSrUN8wNhN-j2ZsEvRjfQg.jpg?width=1080&crop=smart&auto=webp&s=fcace25b68eb7ad21f6d2380b97a8a67ede6d5f9","width":1080,"height":607}],"variants":{},"id":"KLeVxHqiiwS5a5QR5VPd6MMW3STYzjAKYge-BbS6yWM"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvsp49","is_robot_indexable":true,"report_reasons":null,"author":"jackbennyXVI","discussion_type":null,"num_comments":20,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvsp49/til_about_the_jalen_generation_90s_and_2000s_nba/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.espn.com/nba/story/_/id/31309206/the-jalen-generation-how-jalen-rose-name-spread-world-sports","subreddit_subscribers":28095064,"created_utc":1657463459,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_ukqin","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that Marlon Brando horrified a Superman The Movie producer in their first meeting by proposing that Jor-El appear as a green suitcase or a bagel with Brando's voice, but director Richard Donner used flattery to persuade the actor to portray Jor-El himself.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":140,"top_awarded_type":null,"hide_score":false,"name":"t3_vvgd0p","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.95,"author_flair_background_color":null,"subreddit_type":"public","ups":1302,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":1302,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/o_EuQDHdHSVMWj6H3qijFs_X2RJpNdjmvVp0yTXLnls.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657416665,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Superman_(1978_film)#Production","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/InhNrOBVufbkC6N3-IWvLaF7_htGgGz0x1gxqVoJ6sc.jpg?auto=webp&s=dde9972485e5764baba671b8a8a8864d169a33cb","width":220,"height":322},"resolutions":[{"url":"https://external-preview.redd.it/InhNrOBVufbkC6N3-IWvLaF7_htGgGz0x1gxqVoJ6sc.jpg?width=108&crop=smart&auto=webp&s=94c14a3a6d27f12a5b8aae293ff2c155fe75b760","width":108,"height":158},{"url":"https://external-preview.redd.it/InhNrOBVufbkC6N3-IWvLaF7_htGgGz0x1gxqVoJ6sc.jpg?width=216&crop=smart&auto=webp&s=b7741d9bb54c2c8aefce1ef581fdbd7486506ce3","width":216,"height":316}],"variants":{},"id":"uD8UYq5BCiTYX4nZfIxnMq2ZkAsYfSlt2t_5N1O2jF0"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvgd0p","is_robot_indexable":true,"report_reasons":null,"author":"Rami-Al-Saham","discussion_type":null,"num_comments":135,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvgd0p/til_that_marlon_brando_horrified_a_superman_the/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Superman_(1978_film)#Production","subreddit_subscribers":28095064,"created_utc":1657416665,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_35uq37wg","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL That the only natural forest in Greenland is in Qinngua Valley in southern Greenland, only 9 miles long. The surrounding local geography protects the valley floor just enough to support the tree growth despite the sub-Arctic climate.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":140,"top_awarded_type":null,"hide_score":false,"name":"t3_vvmhb6","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.97,"author_flair_background_color":null,"subreddit_type":"public","ups":394,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":394,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/MZSV5puKX6BUtxFcdJjVZL_tvnW-USd0X5vO2L1pWRA.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657439248,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"wondermondo.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.wondermondo.com/qinngua-valley/","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/lw-rdGl9z5M_fhtesgzWCw2IwWEK-aqp5P_14znQXC4.jpg?auto=webp&s=398cc53abe4306589c47ab15d1538817f6a4f260","width":349,"height":465},"resolutions":[{"url":"https://external-preview.redd.it/lw-rdGl9z5M_fhtesgzWCw2IwWEK-aqp5P_14znQXC4.jpg?width=108&crop=smart&auto=webp&s=0965062127dc6e4e65be387dd713f92c26601070","width":108,"height":143},{"url":"https://external-preview.redd.it/lw-rdGl9z5M_fhtesgzWCw2IwWEK-aqp5P_14znQXC4.jpg?width=216&crop=smart&auto=webp&s=9c8abe6c88496edb34aacff5c561dd608fbe4f36","width":216,"height":287},{"url":"https://external-preview.redd.it/lw-rdGl9z5M_fhtesgzWCw2IwWEK-aqp5P_14znQXC4.jpg?width=320&crop=smart&auto=webp&s=c0ff509aaad6c5414ecbba4c2ec43230167fea0d","width":320,"height":426}],"variants":{},"id":"sRuKKRbwlo2giODSepuhpP5CbPwKE1SMmFbM0DTOCrE"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvmhb6","is_robot_indexable":true,"report_reasons":null,"author":"CaptainHMBarclay","discussion_type":null,"num_comments":6,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvmhb6/til_that_the_only_natural_forest_in_greenland_is/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.wondermondo.com/qinngua-valley/","subreddit_subscribers":28095064,"created_utc":1657439248,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_bt06k","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL Crocodiles and alligators are surviving members of an ancient evolutionary division of Archosaurs that dominated the planet in the late Triassic before an extinction event led to them being usurped by Dinosaurs","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":81,"top_awarded_type":null,"hide_score":false,"name":"t3_vv93u4","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.97,"author_flair_background_color":null,"subreddit_type":"public","ups":3796,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":3796,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/5BNJZPKVYazCopj3nBMFGfY24cIJkDub_Gc2hMnB75E.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657394794,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Pseudosuchia","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/eLxVJiot8LZg9OoWX3k5bbEwFxn1IqfQWYGWmvPtYws.jpg?auto=webp&s=953e8d365bcb2e48383ec1555cde2ed946eae521","width":220,"height":128},"resolutions":[{"url":"https://external-preview.redd.it/eLxVJiot8LZg9OoWX3k5bbEwFxn1IqfQWYGWmvPtYws.jpg?width=108&crop=smart&auto=webp&s=11af605c334f13bbbaea1757df3dd9149c3f2174","width":108,"height":62},{"url":"https://external-preview.redd.it/eLxVJiot8LZg9OoWX3k5bbEwFxn1IqfQWYGWmvPtYws.jpg?width=216&crop=smart&auto=webp&s=b56ae3be2d7dec44696d8f2148fc449a81b3315f","width":216,"height":125}],"variants":{},"id":"O8hbZvsddQmqDXlDYUgKEgXzVWLl732LR15kDhieuI8"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vv93u4","is_robot_indexable":true,"report_reasons":null,"author":"doobiedave","discussion_type":null,"num_comments":123,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vv93u4/til_crocodiles_and_alligators_are_surviving/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Pseudosuchia","subreddit_subscribers":28095064,"created_utc":1657394794,"num_crossposts":2,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_n0h91hu","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL The presidential yacht of Yugoslavia, Galeb, was a former Italian and Nazi warship. The Nazis minelayer was sunk by the Allies in 1944 and Yugoslavia raised it, converting it to a yacht in 1952. Ship visitors include Queen Elizabeth II, Khrushchev, Nehru, Nasser, and Kurt Douglas.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":71,"top_awarded_type":null,"hide_score":false,"name":"t3_vvoaxx","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.93,"author_flair_background_color":null,"subreddit_type":"public","ups":219,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":219,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/Ww92jtY1dLJ-_ur9v_nEZHwjW1YpeR14Ms_jxQM_qzs.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657447282,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Yugoslav_training_ship_Galeb","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/mwWTw64L95O-8oxfA11efC4eTWjkfrhNWziAZwGqxSY.jpg?auto=webp&s=1d7052cb35c40594b281e9d6be4453f0b99fefb2","width":300,"height":153},"resolutions":[{"url":"https://external-preview.redd.it/mwWTw64L95O-8oxfA11efC4eTWjkfrhNWziAZwGqxSY.jpg?width=108&crop=smart&auto=webp&s=472dfd3e8ce81bbd3394ce03e2c103466a808ee2","width":108,"height":55},{"url":"https://external-preview.redd.it/mwWTw64L95O-8oxfA11efC4eTWjkfrhNWziAZwGqxSY.jpg?width=216&crop=smart&auto=webp&s=fc3d5e0a50d9e2ad136713d494634a0d578e1337","width":216,"height":110}],"variants":{},"id":"edTyxjGnwUu6-IRPjI3A8JtAhdKIFJ4WmwpAqXcrwZI"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvoaxx","is_robot_indexable":true,"report_reasons":null,"author":"jamescookenotthatone","discussion_type":null,"num_comments":9,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvoaxx/til_the_presidential_yacht_of_yugoslavia_galeb/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Yugoslav_training_ship_Galeb","subreddit_subscribers":28095064,"created_utc":1657447282,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_xfjsj4m","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL traditional grass lawns originated as a status symbol for the wealthy. Neatly cut lawns used solely for aesthetics became a status symbol as it demonstrated that the owner could afford to maintain grass that didn’t serve purposes of food production.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":140,"top_awarded_type":null,"hide_score":false,"name":"t3_vuznlk","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.9,"author_flair_background_color":null,"subreddit_type":"public","ups":65482,"total_awards_received":3,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":65482,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/QVz7x7HBRiF2KZk5OyvLS0KEqrucAD-8qj0GzKaevu8.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{"gid_1":1},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657366084,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"planetnatural.com","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.planetnatural.com/organic-lawn-care-101/history/","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/aCE6LnTPTrQoyelYOXUNIW0jrNkWUF_JePBRiN57hfg.jpg?auto=webp&s=5ddda654e15f1ba111e54c8d0e453c50c65777ef","width":600,"height":600},"resolutions":[{"url":"https://external-preview.redd.it/aCE6LnTPTrQoyelYOXUNIW0jrNkWUF_JePBRiN57hfg.jpg?width=108&crop=smart&auto=webp&s=6483c83e4e669988ed56cac8b6d482e89a90d363","width":108,"height":108},{"url":"https://external-preview.redd.it/aCE6LnTPTrQoyelYOXUNIW0jrNkWUF_JePBRiN57hfg.jpg?width=216&crop=smart&auto=webp&s=adfa1e1ea9e574f5627ffcca5489c22f91193203","width":216,"height":216},{"url":"https://external-preview.redd.it/aCE6LnTPTrQoyelYOXUNIW0jrNkWUF_JePBRiN57hfg.jpg?width=320&crop=smart&auto=webp&s=68540dda4a6ed49ba6fd9efcaff473b12cbcaac3","width":320,"height":320}],"variants":{},"id":"LonMl6LlHE3x-SGPLZQAEp95zaHpozBU7gEVAJb2F0s"}],"enabled":false},"all_awardings":[{"giver_coin_reward":null,"subreddit_id":null,"is_new":false,"days_of_drip_extension":null,"coin_price":150,"id":"award_f44611f1-b89e-46dc-97fe-892280b13b82","penny_donate":null,"award_sub_type":"GLOBAL","coin_reward":0,"icon_url":"https://i.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png","days_of_premium":null,"tiers_by_required_awardings":null,"resized_icons":[{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=16&height=16&auto=webp&s=a5662dfbdb402bf67866c050aa76c31c147c2f45","width":16,"height":16},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=32&height=32&auto=webp&s=a6882eb3f380e8e88009789f4d0072e17b8c59f1","width":32,"height":32},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=48&height=48&auto=webp&s=e50064b090879e8a0b55e433f6ee61d5cb5fbe1d","width":48,"height":48},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=64&height=64&auto=webp&s=8e5bb2e76683cb6b161830bcdd9642049d6adc11","width":64,"height":64},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=128&height=128&auto=webp&s=eda4a9246f95f42ee6940cc0ec65306fd20de878","width":128,"height":128}],"icon_width":2048,"static_icon_width":2048,"start_date":null,"is_enabled":true,"awardings_required_to_grant_benefits":null,"description":"Thank you stranger. Shows the award.","end_date":null,"sticky_duration_seconds":null,"subreddit_coin_reward":0,"count":2,"static_icon_height":2048,"name":"Helpful","resized_static_icons":[{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=16&height=16&auto=webp&s=a5662dfbdb402bf67866c050aa76c31c147c2f45","width":16,"height":16},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=32&height=32&auto=webp&s=a6882eb3f380e8e88009789f4d0072e17b8c59f1","width":32,"height":32},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=48&height=48&auto=webp&s=e50064b090879e8a0b55e433f6ee61d5cb5fbe1d","width":48,"height":48},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=64&height=64&auto=webp&s=8e5bb2e76683cb6b161830bcdd9642049d6adc11","width":64,"height":64},{"url":"https://preview.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png?width=128&height=128&auto=webp&s=eda4a9246f95f42ee6940cc0ec65306fd20de878","width":128,"height":128}],"icon_format":null,"icon_height":2048,"penny_price":null,"award_type":"global","static_icon_url":"https://i.redd.it/award_images/t5_22cerq/klvxk1wggfd41_Helpful.png"},{"giver_coin_reward":null,"subreddit_id":null,"is_new":false,"days_of_drip_extension":null,"coin_price":100,"id":"gid_1","penny_donate":null,"award_sub_type":"GLOBAL","coin_reward":0,"icon_url":"https://www.redditstatic.com/gold/awards/icon/silver_512.png","days_of_premium":null,"tiers_by_required_awardings":null,"resized_icons":[{"url":"https://www.redditstatic.com/gold/awards/icon/silver_16.png","width":16,"height":16},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_32.png","width":32,"height":32},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_48.png","width":48,"height":48},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_64.png","width":64,"height":64},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_128.png","width":128,"height":128}],"icon_width":512,"static_icon_width":512,"start_date":null,"is_enabled":true,"awardings_required_to_grant_benefits":null,"description":"Shows the Silver Award... and that's it.","end_date":null,"sticky_duration_seconds":null,"subreddit_coin_reward":0,"count":1,"static_icon_height":512,"name":"Silver","resized_static_icons":[{"url":"https://www.redditstatic.com/gold/awards/icon/silver_16.png","width":16,"height":16},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_32.png","width":32,"height":32},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_48.png","width":48,"height":48},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_64.png","width":64,"height":64},{"url":"https://www.redditstatic.com/gold/awards/icon/silver_128.png","width":128,"height":128}],"icon_format":null,"icon_height":512,"penny_price":null,"award_type":"global","static_icon_url":"https://www.redditstatic.com/gold/awards/icon/silver_512.png"}],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vuznlk","is_robot_indexable":true,"report_reasons":null,"author":"vinsclortho","discussion_type":null,"num_comments":2991,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vuznlk/til_traditional_grass_lawns_originated_as_a/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.planetnatural.com/organic-lawn-care-101/history/","subreddit_subscribers":28095064,"created_utc":1657366084,"num_crossposts":19,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_ddms3","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that only 20 years after the Wright Brothers first flight, we had successfully completed the first air to air refueling in June 1923.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":100,"top_awarded_type":null,"hide_score":false,"name":"t3_vvmhmp","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.94,"author_flair_background_color":null,"subreddit_type":"public","ups":241,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":241,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/B9PamwRwnHJVAsZPvrlsseYgMhi5-t3v13n8CNyCf4w.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657439289,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"nationalmuseum.af.mil","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.nationalmuseum.af.mil/Visit/Museum-Exhibits/Fact-Sheets/Display/Article/197385/first-air-to-air-refueling/#:~:text=The%20first%20successful%20aerial%20refueling%20took%20place%20on%20June%2027,flying%20beneath%20it%20carrying%20Lts.","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?auto=webp&s=1bb93c33f1c9a9a26c9a0111115d4357c4b7a3ba","width":2000,"height":1438},"resolutions":[{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=108&crop=smart&auto=webp&s=4fc6c059af5a9165ca4caa47873a923553069664","width":108,"height":77},{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=216&crop=smart&auto=webp&s=9aba20132ee0046df60a80faffad47ca598d66da","width":216,"height":155},{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=320&crop=smart&auto=webp&s=faa496fb43a83056682ee9279c6cb66ed9f2fd99","width":320,"height":230},{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=640&crop=smart&auto=webp&s=a3138c5999317d30ac59c345d8804391720cb6e0","width":640,"height":460},{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=960&crop=smart&auto=webp&s=4e91f396d992fb6a1343afd5a406ca13052f88d7","width":960,"height":690},{"url":"https://external-preview.redd.it/oTsOd0X6iYwG8vQy-HUAFy7-dcFFcBZ876sPfzehSn8.jpg?width=1080&crop=smart&auto=webp&s=c25dea087c6f6d3db72753c4b793a6f23d727cb0","width":1080,"height":776}],"variants":{},"id":"tlr9oIQtbyf1F5AyUq-6B062hCZsO3WAcPCzfkRoI4E"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvmhmp","is_robot_indexable":true,"report_reasons":null,"author":"IncRaven","discussion_type":null,"num_comments":6,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvmhmp/til_that_only_20_years_after_the_wright_brothers/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.nationalmuseum.af.mil/Visit/Museum-Exhibits/Fact-Sheets/Display/Article/197385/first-air-to-air-refueling/#:~:text=The%20first%20successful%20aerial%20refueling%20took%20place%20on%20June%2027,flying%20beneath%20it%20carrying%20Lts.","subreddit_subscribers":28095064,"created_utc":1657439289,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_15qqu3","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL Episodes Five and Ten of 1960s Doctor Who story The Daleks' Master Plan were long considered missing until they were found in the basement of a Mormon church in Wandsworth. Nobody has found out how they got there.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":104,"top_awarded_type":null,"hide_score":false,"name":"t3_vv38o7","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.97,"author_flair_background_color":null,"subreddit_type":"public","ups":5689,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":5689,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/y9uEPwvp4lLusoS8kI3XMfE6I6OVcu7YmnZOXARi3VM.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657377966,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/The_Daleks%27_Master_Plan#Production","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/eBcI4tS8G72gfhSbBQTFucvCFg_lWAezpzXoqEuUARE.jpg?auto=webp&s=2cda1140f137388fb507cb931af3a32f1ddfbd70","width":275,"height":206},"resolutions":[{"url":"https://external-preview.redd.it/eBcI4tS8G72gfhSbBQTFucvCFg_lWAezpzXoqEuUARE.jpg?width=108&crop=smart&auto=webp&s=7e13daa9e5f10293ddd2f22b246641c24f83f391","width":108,"height":80},{"url":"https://external-preview.redd.it/eBcI4tS8G72gfhSbBQTFucvCFg_lWAezpzXoqEuUARE.jpg?width=216&crop=smart&auto=webp&s=f474f73b68dffbe8312cc1e348636f52a8b5b7f5","width":216,"height":161}],"variants":{},"id":"qedO-mV8HFrJljWAWjGGtRD7YAkP8vY9XdKFqGvGRfY"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vv38o7","is_robot_indexable":true,"report_reasons":null,"author":"MellotronSymphony","discussion_type":null,"num_comments":128,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vv38o7/til_episodes_five_and_ten_of_1960s_doctor_who/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/The_Daleks%27_Master_Plan#Production","subreddit_subscribers":28095064,"created_utc":1657377966,"num_crossposts":4,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_5l445gn5","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL: William H. H. Murray's 1869 book \"Adventures in the Wilderness; or, Camp Life in the Adirondacks\" was so popular that in a matter of months it caused a \"Murray Rush\"---where thousands of hunters, fishers, and campers from NY and Boston went to Adirondacks and spurred modern American camping.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":null,"top_awarded_type":null,"hide_score":true,"name":"t3_vvt1q5","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.91,"author_flair_background_color":null,"subreddit_type":"public","ups":53,"total_awards_received":0,"media_embed":{},"thumbnail_width":null,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":53,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"default","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"content_categories":null,"is_self":false,"mod_note":null,"created":1657464508,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"nysarchivestrust.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.nysarchivestrust.org/application/files/4315/3012/8733/TYoung_ArchivesMagazine_Sum18.pdf","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvt1q5","is_robot_indexable":true,"report_reasons":null,"author":"kindaweirdflexbutok","discussion_type":null,"num_comments":0,"send_replies":false,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvt1q5/til_william_h_h_murrays_1869_book_adventures_in/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.nysarchivestrust.org/application/files/4315/3012/8733/TYoung_ArchivesMagazine_Sum18.pdf","subreddit_subscribers":28095064,"created_utc":1657464508,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_58kwr","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL Comedian George Carlin recorded a show called \"I Kinda Like It When a Lotta People Die\", on September 10, 2001. The special was obviously shelved.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":140,"top_awarded_type":null,"hide_score":true,"name":"t3_vvub4i","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.89,"author_flair_background_color":null,"subreddit_type":"public","ups":41,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":41,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/gBgREoT0_1wcIDOmRAvGozPbU6o5lfBTif2CLQJ2MhI.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657468158,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/I_Kinda_Like_It_When_a_Lotta_People_Die","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/gReEGuP1-m5BXDAg58Mt9XpV1vaKo-EKsiIm95E2fwM.jpg?auto=webp&s=4a169ddaa1c0b55a7fca6a705d58fbb8b42b5093","width":220,"height":220},"resolutions":[{"url":"https://external-preview.redd.it/gReEGuP1-m5BXDAg58Mt9XpV1vaKo-EKsiIm95E2fwM.jpg?width=108&crop=smart&auto=webp&s=06aaa1cb108a77edce98d658974e626875ca35b9","width":108,"height":108},{"url":"https://external-preview.redd.it/gReEGuP1-m5BXDAg58Mt9XpV1vaKo-EKsiIm95E2fwM.jpg?width=216&crop=smart&auto=webp&s=c063cc99b9cb71d8b3b29cc2548115b96a48ec1a","width":216,"height":216}],"variants":{},"id":"Hriv6keEawWyqxOLjxxydm71A4qoBRj-Auf1WgFJBIU"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvub4i","is_robot_indexable":true,"report_reasons":null,"author":"FalconPUNNCH","discussion_type":null,"num_comments":6,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvub4i/til_comedian_george_carlin_recorded_a_show_called/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/I_Kinda_Like_It_When_a_Lotta_People_Die","subreddit_subscribers":28095064,"created_utc":1657468158,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_7bpc8z8","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that the Voyager 1 Space probe launched by NASA in 1977 has traveled over 14 billion miles away from earth as of 2022.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":76,"top_awarded_type":null,"hide_score":false,"name":"t3_vvhkwz","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.95,"author_flair_background_color":null,"subreddit_type":"public","ups":359,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":359,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/3VqlBh7giinIvybSIYHZNnSoZ_eNEWHukZMNSoT1Ji4.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657420728,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"voyager.jpl.nasa.gov","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://voyager.jpl.nasa.gov/news/details.php?article_id=2","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/ADAZzQOymEuYDtxSb5xkQJHhmL7KFYvVtT2svo23K90.jpg?auto=webp&s=37bbe6a6fd768a61b5f3197972f882469f17d733","width":800,"height":438},"resolutions":[{"url":"https://external-preview.redd.it/ADAZzQOymEuYDtxSb5xkQJHhmL7KFYvVtT2svo23K90.jpg?width=108&crop=smart&auto=webp&s=2e174ff6732f7bc5084d6e780f9f8f4579f84f20","width":108,"height":59},{"url":"https://external-preview.redd.it/ADAZzQOymEuYDtxSb5xkQJHhmL7KFYvVtT2svo23K90.jpg?width=216&crop=smart&auto=webp&s=18e6427fe46a366fb77cb5302607827c240384e0","width":216,"height":118},{"url":"https://external-preview.redd.it/ADAZzQOymEuYDtxSb5xkQJHhmL7KFYvVtT2svo23K90.jpg?width=320&crop=smart&auto=webp&s=416ea53b7e56b021a96eba7f4b946cd628128802","width":320,"height":175},{"url":"https://external-preview.redd.it/ADAZzQOymEuYDtxSb5xkQJHhmL7KFYvVtT2svo23K90.jpg?width=640&crop=smart&auto=webp&s=618ecb59fe8a5492467b670d2a3eea5ee8b2de36","width":640,"height":350}],"variants":{},"id":"vl7Ps4fDLLkh5a5IWjKd0W95ARRJH1Dqi2QvaPhUFYE"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvhkwz","is_robot_indexable":true,"report_reasons":null,"author":"Heartfeltzero","discussion_type":null,"num_comments":33,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvhkwz/til_that_the_voyager_1_space_probe_launched_by/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://voyager.jpl.nasa.gov/news/details.php?article_id=2","subreddit_subscribers":28095064,"created_utc":1657420728,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_f1d1xhi","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL due its slow rotation around its own axis and its uneven orbital path around the sun, occasionally the sun will appear to reverse its path in Mercury's sky, and reverse again, causing Mercury to sometimes have a double sunrise.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":24,"top_awarded_type":null,"hide_score":false,"name":"t3_vv8098","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.97,"author_flair_background_color":null,"subreddit_type":"public","ups":1522,"total_awards_received":0,"media_embed":{},"thumbnail_width":24,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":1522,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/OMxtjR8AKR5CDqiwIrt7i9oH3IkdG4gI8p1p_rgXLG8.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657391630,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Mercury_(planet)#Orbit,_rotation,_and_longitude","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/vh6Sog2bbD_5h_I37YJwfAoBE4jmKGvmObU_yhC0Lp0.jpg?auto=webp&s=5c40dbf0cbab66a3ac742f94b306ef3a5d838a77","width":24,"height":24},"resolutions":[],"variants":{},"id":"0v7NgAzyloCU0Pibx_1XtyeTH5bYxrS3fPr_6JhNLwk"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vv8098","is_robot_indexable":true,"report_reasons":null,"author":"OccludedFug","discussion_type":null,"num_comments":38,"send_replies":false,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vv8098/til_due_its_slow_rotation_around_its_own_axis_and/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Mercury_(planet)#Orbit,_rotation,_and_longitude","subreddit_subscribers":28095064,"created_utc":1657391630,"num_crossposts":1,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_5g67m","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that though the roots of Traditional Chinese Medicine go back thousands of years, the modern push for it in China only began in 1950.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":105,"top_awarded_type":null,"hide_score":false,"name":"t3_vvfr63","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.92,"author_flair_background_color":"","subreddit_type":"public","ups":431,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":431,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/i2z1TtrxxAGNfvC0rAFaW9BTXE9ZnX6Q5BKpcj4r3b8.jpg","edited":false,"author_flair_css_class":"points points-1 q-WUZDjQ","author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657414679,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Traditional_Chinese_medicine#People's_Republic","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/m2whNgYlprStAQ78KN6qp_IplZsKh2gC8kpMfNxZGfY.jpg?auto=webp&s=dcf9a48a55114c57c31e8dcaaed2f2150d0577f6","width":200,"height":150},"resolutions":[{"url":"https://external-preview.redd.it/m2whNgYlprStAQ78KN6qp_IplZsKh2gC8kpMfNxZGfY.jpg?width=108&crop=smart&auto=webp&s=22b08b35e85cb6d38c0352c90c0a9be2815cd36f","width":108,"height":81}],"variants":{},"id":"fpyZeWjveef5CPJqadEUMjtKQI_UGan4f2n80PG4zDo"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":"2","treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvfr63","is_robot_indexable":true,"report_reasons":null,"author":"Flaxmoore","discussion_type":null,"num_comments":63,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":"dark","permalink":"/r/todayilearned/comments/vvfr63/til_that_though_the_roots_of_traditional_chinese/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Traditional_Chinese_medicine#People's_Republic","subreddit_subscribers":28095064,"created_utc":1657414679,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_c30bsfsg","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that the character Koba from Planet of the Apes (2010s) is named after Joseph Stalin, who also used \"Koba\" as his nickname. The name originally comes from a character in a Georgian book called The Patricide, which inspired Stalin.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":105,"top_awarded_type":null,"hide_score":false,"name":"t3_vvlwug","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.92,"author_flair_background_color":null,"subreddit_type":"public","ups":119,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":119,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/tXpteMmIuAQEr6sb3hndYFdd5CJbR_Rp_gRDJOTgifk.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657436770,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/The_Patricide","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/popP6z7fkeigaMiVVLW5rgg82dtDdx1oAmvt5Tkn3xQ.jpg?auto=webp&s=cab045ee257c377ae2eab162cfdbc4c89c0187f1","width":300,"height":225},"resolutions":[{"url":"https://external-preview.redd.it/popP6z7fkeigaMiVVLW5rgg82dtDdx1oAmvt5Tkn3xQ.jpg?width=108&crop=smart&auto=webp&s=ef90d0ac64c96a14c35b6aa2e46647460af43b1d","width":108,"height":81},{"url":"https://external-preview.redd.it/popP6z7fkeigaMiVVLW5rgg82dtDdx1oAmvt5Tkn3xQ.jpg?width=216&crop=smart&auto=webp&s=3510a3a324b07be7799cfba5c3547483f55ad4cb","width":216,"height":162}],"variants":{},"id":"a5eI1RFdfzle9qV5qXUEDIZdjuDSYF_j2ffRWlxgMFQ"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvlwug","is_robot_indexable":true,"report_reasons":null,"author":"PuppetPeacher","discussion_type":null,"num_comments":0,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvlwug/til_that_the_character_koba_from_planet_of_the/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/The_Patricide","subreddit_subscribers":28095064,"created_utc":1657436770,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_gv944s8s","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL Jim Henson was an early pioneer in digital sets and computer-created puppets.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":105,"top_awarded_type":null,"hide_score":true,"name":"t3_vvtyzb","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.83,"author_flair_background_color":null,"subreddit_type":"public","ups":18,"total_awards_received":0,"media_embed":{"content":"<iframe width=\"267\" height=\"200\" src=\"https://www.youtube.com/embed/ssoGhnqkEXw?feature=oembed&enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen title=\"The Jim Henson Hour 10 Secrets of the Muppets\"></iframe>","width":267,"scrolling":false,"height":200},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":{"type":"youtube.com","oembed":{"provider_url":"https://www.youtube.com/","version":"1.0","title":"The Jim Henson Hour 10 Secrets of the Muppets","type":"video","thumbnail_width":480,"height":200,"width":267,"html":"<iframe width=\"267\" height=\"200\" src=\"https://www.youtube.com/embed/ssoGhnqkEXw?feature=oembed&enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen title=\"The Jim Henson Hour 10 Secrets of the Muppets\"></iframe>","author_name":"Steve Diggins","provider_name":"YouTube","thumbnail_url":"https://i.ytimg.com/vi/ssoGhnqkEXw/hqdefault.jpg","thumbnail_height":360,"author_url":"https://www.youtube.com/c/SteveDiggins"}},"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{"content":"<iframe width=\"267\" height=\"200\" src=\"https://www.youtube.com/embed/ssoGhnqkEXw?feature=oembed&enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen title=\"The Jim Henson Hour 10 Secrets of the Muppets\"></iframe>","width":267,"scrolling":false,"media_domain_url":"https://www.redditmedia.com/mediaembed/vvtyzb","height":200},"link_flair_text":null,"can_mod_post":false,"score":18,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/wByvfD3jaQX0780g0M2ectSt80JR4eTp-5Bc2FSqMsU.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"rich:video","content_categories":null,"is_self":false,"mod_note":null,"created":1657467168,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"youtube.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.youtube.com/watch?v=ssoGhnqkEXw","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/WbrsrqhW-4Z6o8I-V64ug5CVDUJdVsn8J0WJQ9gr3B8.jpg?auto=webp&s=a0ecc8d5b3f54a7926fd7b5a0028f8b4718104f6","width":480,"height":360},"resolutions":[{"url":"https://external-preview.redd.it/WbrsrqhW-4Z6o8I-V64ug5CVDUJdVsn8J0WJQ9gr3B8.jpg?width=108&crop=smart&auto=webp&s=c9dfcea9179fed2263401c89848a485141865d50","width":108,"height":81},{"url":"https://external-preview.redd.it/WbrsrqhW-4Z6o8I-V64ug5CVDUJdVsn8J0WJQ9gr3B8.jpg?width=216&crop=smart&auto=webp&s=66435eec2a1e7c3a7b2cf9dfb60f25164505a3e1","width":216,"height":162},{"url":"https://external-preview.redd.it/WbrsrqhW-4Z6o8I-V64ug5CVDUJdVsn8J0WJQ9gr3B8.jpg?width=320&crop=smart&auto=webp&s=2d27a04b9b6263b28c543532d70e2abeb34dcaf0","width":320,"height":240}],"variants":{},"id":"0hxilZ5s4gZdNZs4KLs70_P_gFzz0zRTyokG53n_YQo"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvtyzb","is_robot_indexable":true,"report_reasons":null,"author":"JonnyCarlisle","discussion_type":null,"num_comments":3,"send_replies":false,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvtyzb/til_jim_henson_was_an_early_pioneer_in_digital/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.youtube.com/watch?v=ssoGhnqkEXw","subreddit_subscribers":28095064,"created_utc":1657467168,"num_crossposts":0,"media":{"type":"youtube.com","oembed":{"provider_url":"https://www.youtube.com/","version":"1.0","title":"The Jim Henson Hour 10 Secrets of the Muppets","type":"video","thumbnail_width":480,"height":200,"width":267,"html":"<iframe width=\"267\" height=\"200\" src=\"https://www.youtube.com/embed/ssoGhnqkEXw?feature=oembed&enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen title=\"The Jim Henson Hour 10 Secrets of the Muppets\"></iframe>","author_name":"Steve Diggins","provider_name":"YouTube","thumbnail_url":"https://i.ytimg.com/vi/ssoGhnqkEXw/hqdefault.jpg","thumbnail_height":360,"author_url":"https://www.youtube.com/c/SteveDiggins"}},"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_xwuwn","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL the price of carbon fiber for aircraft construction dropped due to innovations driven by the B-2 program in the 1980s and Boeing 777 work in the 1990s","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":null,"top_awarded_type":null,"hide_score":false,"name":"t3_vvibkx","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.9,"author_flair_background_color":null,"subreddit_type":"public","ups":103,"total_awards_received":0,"media_embed":{},"thumbnail_width":null,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":103,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"default","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"content_categories":null,"is_self":false,"mod_note":null,"created":1657423197,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"faa.gov","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.faa.gov/sites/faa.gov/files/regulations_policies/handbooks_manuals/aviation/phak/05_phak_ch3.pdf","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvibkx","is_robot_indexable":true,"report_reasons":null,"author":"Fenceypents","discussion_type":null,"num_comments":4,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvibkx/til_the_price_of_carbon_fiber_for_aircraft/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.faa.gov/sites/faa.gov/files/regulations_policies/handbooks_manuals/aviation/phak/05_phak_ch3.pdf","subreddit_subscribers":28095064,"created_utc":1657423197,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_hgwvtkcu","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL The Babcock father and son team constructed the first solar magnetograph, which allowed them to measure the general magnetic field of the sun. The son, Horace Babcock, was able to discover magnetic fields in more distant stars with his own invention","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":73,"top_awarded_type":null,"hide_score":false,"name":"t3_vvdt47","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.94,"author_flair_background_color":null,"subreddit_type":"public","ups":186,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":186,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://b.thumbs.redditmedia.com/ovKKfF6WnCWCEdMgsqdXfqqLa3m5mplL6LtufoMUNxY.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657408588,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"latimes.com","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.latimes.com/archives/la-xpm-2003-sep-03-me-babcock3-story.html","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?auto=webp&s=aab8b7ba8dca5d0d2a70937bbcb803d6adcc8f04","width":1200,"height":630},"resolutions":[{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=108&crop=smart&auto=webp&s=db706f6a0f120ace2708493b1598fcdc08c1b4c7","width":108,"height":56},{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=216&crop=smart&auto=webp&s=ea9e18bbc01ce9e1266cb6b3104896f5e8b8bbc9","width":216,"height":113},{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=320&crop=smart&auto=webp&s=313b1c9455a2f39d7d7bcf8e6ebf828e1ebd436f","width":320,"height":168},{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=640&crop=smart&auto=webp&s=f2ad697563f4ac86029f0b7d26c0a4dcb45b51e1","width":640,"height":336},{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=960&crop=smart&auto=webp&s=a66a7de883324750b2af502897580c0e20a098cc","width":960,"height":504},{"url":"https://external-preview.redd.it/zJvjxad9pDsgjZEL2jne0Wicpn9ssy39YHlulTp0TbA.jpg?width=1080&crop=smart&auto=webp&s=ccda4bb0eb077e92554580b7306ab480cfa0d742","width":1080,"height":567}],"variants":{},"id":"m_h9JuOku-ek7vZzYYxccgt9gOHOn6PAkypoQdr6mks"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvdt47","is_robot_indexable":true,"report_reasons":null,"author":"vancouver_reader","discussion_type":null,"num_comments":4,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvdt47/til_the_babcock_father_and_son_team_constructed/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.latimes.com/archives/la-xpm-2003-sep-03-me-babcock3-story.html","subreddit_subscribers":28095064,"created_utc":1657408588,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_27eidmxc","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that just like their Roman Enemies, Carthage transitioned from a Monarchy into a Republic. Their government was led by 2 Sufets (Judges) elected by a parliament mad up of the City's leading noble families. Unlike Rome however a separate, popularly-elected official commanded the military.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":50,"top_awarded_type":null,"hide_score":false,"name":"t3_vvkhwl","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.88,"author_flair_background_color":null,"subreddit_type":"public","ups":47,"total_awards_received":0,"media_embed":{},"thumbnail_width":50,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":47,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/DCsneTUrMyNgSQ9BkL6OO8MjrO3HgocneDRsnud4eP0.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657431061,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Ancient_Carthage#Government_and_politics","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/SEGFpkqMwDyQWRJTX_bS4PZXmQSDz26kbbNa04cHZi0.jpg?auto=webp&s=c47a59bd6a8dbf5a6922b08c58c83371537841a7","width":50,"height":120},"resolutions":[],"variants":{},"id":"v65XeiBsPFIcI-RkRzu_hYCmCWIiITRGY7mSofKh6no"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvkhwl","is_robot_indexable":true,"report_reasons":null,"author":"Khysamgathys","discussion_type":null,"num_comments":7,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvkhwl/til_that_just_like_their_roman_enemies_carthage/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Ancient_Carthage#Government_and_politics","subreddit_subscribers":28095064,"created_utc":1657431061,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_buceuips","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL that during the Civil War, Asa Tift, a notable Salvager from Key West, Florida, and his brothers financed a ship to be built for the Confederates in Mobile, Alabama. However, after the Unions victory at Vicksburg, Tift and his brothers decided to blow up the ship rather than let it be captured.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":null,"top_awarded_type":null,"hide_score":false,"name":"t3_vvfi62","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.86,"author_flair_background_color":null,"subreddit_type":"public","ups":110,"total_awards_received":0,"media_embed":{},"thumbnail_width":null,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":110,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"default","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"content_categories":null,"is_self":false,"mod_note":null,"created":1657413904,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"en.wikipedia.org","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://en.wikipedia.org/wiki/Asa_Tift","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvfi62","is_robot_indexable":true,"report_reasons":null,"author":"FranklinDRoosevelt32","discussion_type":null,"num_comments":17,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvfi62/til_that_during_the_civil_war_asa_tift_a_notable/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://en.wikipedia.org/wiki/Asa_Tift","subreddit_subscribers":28095064,"created_utc":1657413904,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_hcigvdbi","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TILT there were (twin) pregnancies wherein the more developed kid pumps blood for both the twins (acardiac and cardiac), and the acardiac twin cannot reciprocate it in any way, therefore causing cardiac failure in the developed one.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":null,"top_awarded_type":null,"hide_score":false,"name":"t3_vvi557","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.88,"author_flair_background_color":null,"subreddit_type":"public","ups":63,"total_awards_received":0,"media_embed":{},"thumbnail_width":null,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":63,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"default","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"content_categories":null,"is_self":false,"mod_note":null,"created":1657422593,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"chop.edu","allow_live_comments":false,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.chop.edu/conditions-diseases/twin-reversed-arterial-perfusion-sequence-and-bipolar-cord-coagulation-for-acardiac-acephalic-twins","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vvi557","is_robot_indexable":true,"report_reasons":null,"author":"probably_not_helpin","discussion_type":null,"num_comments":12,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vvi557/tilt_there_were_twin_pregnancies_wherein_the_more/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.chop.edu/conditions-diseases/twin-reversed-arterial-perfusion-sequence-and-bipolar-cord-coagulation-for-acardiac-acephalic-twins","subreddit_subscribers":28095064,"created_utc":1657422593,"num_crossposts":0,"media":null,"is_video":false}},{"kind":"t3","data":{"approved_at_utc":null,"subreddit":"todayilearned","selftext":"","author_fullname":"t2_45okmweo","saved":false,"mod_reason_title":null,"gilded":0,"clicked":false,"title":"TIL The only children to survive the Titanic without a parent were two brothers aged 2 and 4. Their father kidnapped them from his ex-wife and boarded the ship with a fake name. The father didn’t survive and for weeks the boys were known as the Titanic Orphans until their mother was found.","link_flair_richtext":[],"subreddit_name_prefixed":"r/todayilearned","hidden":false,"pwls":6,"link_flair_css_class":null,"downs":0,"thumbnail_height":78,"top_awarded_type":null,"hide_score":false,"name":"t3_vupezm","quarantine":false,"link_flair_text_color":"dark","upvote_ratio":0.98,"author_flair_background_color":null,"subreddit_type":"public","ups":6746,"total_awards_received":0,"media_embed":{},"thumbnail_width":140,"author_flair_template_id":null,"is_original_content":false,"user_reports":[],"secure_media":null,"is_reddit_media_domain":false,"is_meta":false,"category":null,"secure_media_embed":{},"link_flair_text":null,"can_mod_post":false,"score":6746,"approved_by":null,"is_created_from_ads_ui":false,"author_premium":false,"thumbnail":"https://a.thumbs.redditmedia.com/jzXAmwsnTAl15JaxkpTA9qgiqOD5z8YcWXVjx2D24u8.jpg","edited":false,"author_flair_css_class":null,"author_flair_richtext":[],"gildings":{},"post_hint":"link","content_categories":null,"is_self":false,"mod_note":null,"created":1657327438,"link_flair_type":"text","wls":6,"removed_by_category":null,"banned_by":null,"author_flair_type":"text","domain":"npr.org","allow_live_comments":true,"selftext_html":null,"likes":null,"suggested_sort":null,"banned_at_utc":null,"url_overridden_by_dest":"https://www.npr.org/sections/pictureshow/2012/04/18/150799600/louis-and-lump-tiny-tots-saved-at-sea","view_count":null,"archived":false,"no_follow":false,"is_crosspostable":false,"pinned":false,"over_18":false,"preview":{"images":[{"source":{"url":"https://external-preview.redd.it/Ut9VEuUf8W6-NC9HZe74W8LZi-mnqHX5hXKEli53otY.jpg?auto=webp&s=0806739e3216ae7efc7a51f7445792885c33d5dd","width":822,"height":462},"resolutions":[{"url":"https://external-preview.redd.it/Ut9VEuUf8W6-NC9HZe74W8LZi-mnqHX5hXKEli53otY.jpg?width=108&crop=smart&auto=webp&s=c29b5d379dfc26d608c55f548c06e56c2dabf548","width":108,"height":60},{"url":"https://external-preview.redd.it/Ut9VEuUf8W6-NC9HZe74W8LZi-mnqHX5hXKEli53otY.jpg?width=216&crop=smart&auto=webp&s=d8bf13b11c738aee1fd5ffc78e8289cbccd43118","width":216,"height":121},{"url":"https://external-preview.redd.it/Ut9VEuUf8W6-NC9HZe74W8LZi-mnqHX5hXKEli53otY.jpg?width=320&crop=smart&auto=webp&s=19944e4693c7cb9f72d904b0009a1948020826ea","width":320,"height":179},{"url":"https://external-preview.redd.it/Ut9VEuUf8W6-NC9HZe74W8LZi-mnqHX5hXKEli53otY.jpg?width=640&crop=smart&auto=webp&s=20c9efdeff73f306ea8da037b61004fc1d7d4d6f","width":640,"height":359}],"variants":{},"id":"5ANHH5hM7IfsJtvEKYbryBU4NIZ9Idcx8JfD8VUtqAo"}],"enabled":false},"all_awardings":[],"awarders":[],"media_only":false,"can_gild":false,"spoiler":false,"locked":false,"author_flair_text":null,"treatment_tags":[],"visited":false,"removed_by":null,"num_reports":null,"distinguished":null,"subreddit_id":"t5_2qqjc","author_is_blocked":false,"mod_reason_by":null,"removal_reason":null,"link_flair_background_color":"","id":"vupezm","is_robot_indexable":true,"report_reasons":null,"author":"triviafrenzy","discussion_type":null,"num_comments":73,"send_replies":true,"whitelist_status":"all_ads","contest_mode":false,"mod_reports":[],"author_patreon_flair":false,"author_flair_text_color":null,"permalink":"/r/todayilearned/comments/vupezm/til_the_only_children_to_survive_the_titanic/","parent_whitelist_status":"all_ads","stickied":false,"url":"https://www.npr.org/sections/pictureshow/2012/04/18/150799600/louis-and-lump-tiny-tots-saved-at-sea","subreddit_subscribers":28095064,"created_utc":1657327438,"num_crossposts":3,"media":null,"is_video":false}}],"before":null}} -------------------------------------------------------------------------------- /sample/rickandmorty.json: -------------------------------------------------------------------------------- 1 | {"info":{"count":826,"pages":42,"next":"https://rickandmortyapi.com/api/character/?page=2","prev":null},"results":[{"id":1,"name":"Rick Sanchez","status":"Alive","species":"Human","type":"","gender":"Male","origin":{"name":"Earth (C-137)","url":"https://rickandmortyapi.com/api/location/1"},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/1.jpeg","episode":["https://rickandmortyapi.com/api/episode/1","https://rickandmortyapi.com/api/episode/2","https://rickandmortyapi.com/api/episode/3","https://rickandmortyapi.com/api/episode/4","https://rickandmortyapi.com/api/episode/5","https://rickandmortyapi.com/api/episode/6","https://rickandmortyapi.com/api/episode/7","https://rickandmortyapi.com/api/episode/8","https://rickandmortyapi.com/api/episode/9","https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11","https://rickandmortyapi.com/api/episode/12","https://rickandmortyapi.com/api/episode/13","https://rickandmortyapi.com/api/episode/14","https://rickandmortyapi.com/api/episode/15","https://rickandmortyapi.com/api/episode/16","https://rickandmortyapi.com/api/episode/17","https://rickandmortyapi.com/api/episode/18","https://rickandmortyapi.com/api/episode/19","https://rickandmortyapi.com/api/episode/20","https://rickandmortyapi.com/api/episode/21","https://rickandmortyapi.com/api/episode/22","https://rickandmortyapi.com/api/episode/23","https://rickandmortyapi.com/api/episode/24","https://rickandmortyapi.com/api/episode/25","https://rickandmortyapi.com/api/episode/26","https://rickandmortyapi.com/api/episode/27","https://rickandmortyapi.com/api/episode/28","https://rickandmortyapi.com/api/episode/29","https://rickandmortyapi.com/api/episode/30","https://rickandmortyapi.com/api/episode/31","https://rickandmortyapi.com/api/episode/32","https://rickandmortyapi.com/api/episode/33","https://rickandmortyapi.com/api/episode/34","https://rickandmortyapi.com/api/episode/35","https://rickandmortyapi.com/api/episode/36","https://rickandmortyapi.com/api/episode/37","https://rickandmortyapi.com/api/episode/38","https://rickandmortyapi.com/api/episode/39","https://rickandmortyapi.com/api/episode/40","https://rickandmortyapi.com/api/episode/41","https://rickandmortyapi.com/api/episode/42","https://rickandmortyapi.com/api/episode/43","https://rickandmortyapi.com/api/episode/44","https://rickandmortyapi.com/api/episode/45","https://rickandmortyapi.com/api/episode/46","https://rickandmortyapi.com/api/episode/47","https://rickandmortyapi.com/api/episode/48","https://rickandmortyapi.com/api/episode/49","https://rickandmortyapi.com/api/episode/50","https://rickandmortyapi.com/api/episode/51"],"url":"https://rickandmortyapi.com/api/character/1","created":"2017-11-04T18:48:46.250Z"},{"id":2,"name":"Morty Smith","status":"Alive","species":"Human","type":"","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/2.jpeg","episode":["https://rickandmortyapi.com/api/episode/1","https://rickandmortyapi.com/api/episode/2","https://rickandmortyapi.com/api/episode/3","https://rickandmortyapi.com/api/episode/4","https://rickandmortyapi.com/api/episode/5","https://rickandmortyapi.com/api/episode/6","https://rickandmortyapi.com/api/episode/7","https://rickandmortyapi.com/api/episode/8","https://rickandmortyapi.com/api/episode/9","https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11","https://rickandmortyapi.com/api/episode/12","https://rickandmortyapi.com/api/episode/13","https://rickandmortyapi.com/api/episode/14","https://rickandmortyapi.com/api/episode/15","https://rickandmortyapi.com/api/episode/16","https://rickandmortyapi.com/api/episode/17","https://rickandmortyapi.com/api/episode/18","https://rickandmortyapi.com/api/episode/19","https://rickandmortyapi.com/api/episode/20","https://rickandmortyapi.com/api/episode/21","https://rickandmortyapi.com/api/episode/22","https://rickandmortyapi.com/api/episode/23","https://rickandmortyapi.com/api/episode/24","https://rickandmortyapi.com/api/episode/25","https://rickandmortyapi.com/api/episode/26","https://rickandmortyapi.com/api/episode/27","https://rickandmortyapi.com/api/episode/28","https://rickandmortyapi.com/api/episode/29","https://rickandmortyapi.com/api/episode/30","https://rickandmortyapi.com/api/episode/31","https://rickandmortyapi.com/api/episode/32","https://rickandmortyapi.com/api/episode/33","https://rickandmortyapi.com/api/episode/34","https://rickandmortyapi.com/api/episode/35","https://rickandmortyapi.com/api/episode/36","https://rickandmortyapi.com/api/episode/37","https://rickandmortyapi.com/api/episode/38","https://rickandmortyapi.com/api/episode/39","https://rickandmortyapi.com/api/episode/40","https://rickandmortyapi.com/api/episode/41","https://rickandmortyapi.com/api/episode/42","https://rickandmortyapi.com/api/episode/43","https://rickandmortyapi.com/api/episode/44","https://rickandmortyapi.com/api/episode/45","https://rickandmortyapi.com/api/episode/46","https://rickandmortyapi.com/api/episode/47","https://rickandmortyapi.com/api/episode/48","https://rickandmortyapi.com/api/episode/49","https://rickandmortyapi.com/api/episode/50","https://rickandmortyapi.com/api/episode/51"],"url":"https://rickandmortyapi.com/api/character/2","created":"2017-11-04T18:50:21.651Z"},{"id":3,"name":"Summer Smith","status":"Alive","species":"Human","type":"","gender":"Female","origin":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/3.jpeg","episode":["https://rickandmortyapi.com/api/episode/6","https://rickandmortyapi.com/api/episode/7","https://rickandmortyapi.com/api/episode/8","https://rickandmortyapi.com/api/episode/9","https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11","https://rickandmortyapi.com/api/episode/12","https://rickandmortyapi.com/api/episode/14","https://rickandmortyapi.com/api/episode/15","https://rickandmortyapi.com/api/episode/16","https://rickandmortyapi.com/api/episode/17","https://rickandmortyapi.com/api/episode/18","https://rickandmortyapi.com/api/episode/19","https://rickandmortyapi.com/api/episode/20","https://rickandmortyapi.com/api/episode/21","https://rickandmortyapi.com/api/episode/22","https://rickandmortyapi.com/api/episode/23","https://rickandmortyapi.com/api/episode/24","https://rickandmortyapi.com/api/episode/25","https://rickandmortyapi.com/api/episode/26","https://rickandmortyapi.com/api/episode/27","https://rickandmortyapi.com/api/episode/29","https://rickandmortyapi.com/api/episode/30","https://rickandmortyapi.com/api/episode/31","https://rickandmortyapi.com/api/episode/32","https://rickandmortyapi.com/api/episode/33","https://rickandmortyapi.com/api/episode/34","https://rickandmortyapi.com/api/episode/35","https://rickandmortyapi.com/api/episode/36","https://rickandmortyapi.com/api/episode/38","https://rickandmortyapi.com/api/episode/39","https://rickandmortyapi.com/api/episode/40","https://rickandmortyapi.com/api/episode/41","https://rickandmortyapi.com/api/episode/42","https://rickandmortyapi.com/api/episode/43","https://rickandmortyapi.com/api/episode/44","https://rickandmortyapi.com/api/episode/45","https://rickandmortyapi.com/api/episode/46","https://rickandmortyapi.com/api/episode/47","https://rickandmortyapi.com/api/episode/48","https://rickandmortyapi.com/api/episode/49","https://rickandmortyapi.com/api/episode/51"],"url":"https://rickandmortyapi.com/api/character/3","created":"2017-11-04T19:09:56.428Z"},{"id":4,"name":"Beth Smith","status":"Alive","species":"Human","type":"","gender":"Female","origin":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/4.jpeg","episode":["https://rickandmortyapi.com/api/episode/6","https://rickandmortyapi.com/api/episode/7","https://rickandmortyapi.com/api/episode/8","https://rickandmortyapi.com/api/episode/9","https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11","https://rickandmortyapi.com/api/episode/12","https://rickandmortyapi.com/api/episode/14","https://rickandmortyapi.com/api/episode/15","https://rickandmortyapi.com/api/episode/16","https://rickandmortyapi.com/api/episode/18","https://rickandmortyapi.com/api/episode/19","https://rickandmortyapi.com/api/episode/20","https://rickandmortyapi.com/api/episode/21","https://rickandmortyapi.com/api/episode/22","https://rickandmortyapi.com/api/episode/23","https://rickandmortyapi.com/api/episode/24","https://rickandmortyapi.com/api/episode/25","https://rickandmortyapi.com/api/episode/26","https://rickandmortyapi.com/api/episode/27","https://rickandmortyapi.com/api/episode/28","https://rickandmortyapi.com/api/episode/29","https://rickandmortyapi.com/api/episode/30","https://rickandmortyapi.com/api/episode/31","https://rickandmortyapi.com/api/episode/32","https://rickandmortyapi.com/api/episode/33","https://rickandmortyapi.com/api/episode/34","https://rickandmortyapi.com/api/episode/35","https://rickandmortyapi.com/api/episode/36","https://rickandmortyapi.com/api/episode/38","https://rickandmortyapi.com/api/episode/39","https://rickandmortyapi.com/api/episode/40","https://rickandmortyapi.com/api/episode/41","https://rickandmortyapi.com/api/episode/42","https://rickandmortyapi.com/api/episode/43","https://rickandmortyapi.com/api/episode/44","https://rickandmortyapi.com/api/episode/45","https://rickandmortyapi.com/api/episode/46","https://rickandmortyapi.com/api/episode/47","https://rickandmortyapi.com/api/episode/48","https://rickandmortyapi.com/api/episode/49","https://rickandmortyapi.com/api/episode/51"],"url":"https://rickandmortyapi.com/api/character/4","created":"2017-11-04T19:22:43.665Z"},{"id":5,"name":"Jerry Smith","status":"Alive","species":"Human","type":"","gender":"Male","origin":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/5.jpeg","episode":["https://rickandmortyapi.com/api/episode/6","https://rickandmortyapi.com/api/episode/7","https://rickandmortyapi.com/api/episode/8","https://rickandmortyapi.com/api/episode/9","https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11","https://rickandmortyapi.com/api/episode/12","https://rickandmortyapi.com/api/episode/13","https://rickandmortyapi.com/api/episode/14","https://rickandmortyapi.com/api/episode/15","https://rickandmortyapi.com/api/episode/16","https://rickandmortyapi.com/api/episode/18","https://rickandmortyapi.com/api/episode/19","https://rickandmortyapi.com/api/episode/20","https://rickandmortyapi.com/api/episode/21","https://rickandmortyapi.com/api/episode/22","https://rickandmortyapi.com/api/episode/23","https://rickandmortyapi.com/api/episode/26","https://rickandmortyapi.com/api/episode/29","https://rickandmortyapi.com/api/episode/30","https://rickandmortyapi.com/api/episode/31","https://rickandmortyapi.com/api/episode/32","https://rickandmortyapi.com/api/episode/33","https://rickandmortyapi.com/api/episode/35","https://rickandmortyapi.com/api/episode/36","https://rickandmortyapi.com/api/episode/38","https://rickandmortyapi.com/api/episode/39","https://rickandmortyapi.com/api/episode/40","https://rickandmortyapi.com/api/episode/41","https://rickandmortyapi.com/api/episode/42","https://rickandmortyapi.com/api/episode/43","https://rickandmortyapi.com/api/episode/44","https://rickandmortyapi.com/api/episode/45","https://rickandmortyapi.com/api/episode/46","https://rickandmortyapi.com/api/episode/47","https://rickandmortyapi.com/api/episode/48","https://rickandmortyapi.com/api/episode/49","https://rickandmortyapi.com/api/episode/50","https://rickandmortyapi.com/api/episode/51"],"url":"https://rickandmortyapi.com/api/character/5","created":"2017-11-04T19:26:56.301Z"},{"id":6,"name":"Abadango Cluster Princess","status":"Alive","species":"Alien","type":"","gender":"Female","origin":{"name":"Abadango","url":"https://rickandmortyapi.com/api/location/2"},"location":{"name":"Abadango","url":"https://rickandmortyapi.com/api/location/2"},"image":"https://rickandmortyapi.com/api/character/avatar/6.jpeg","episode":["https://rickandmortyapi.com/api/episode/27"],"url":"https://rickandmortyapi.com/api/character/6","created":"2017-11-04T19:50:28.250Z"},{"id":7,"name":"Abradolf Lincler","status":"unknown","species":"Human","type":"Genetic experiment","gender":"Male","origin":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"location":{"name":"Testicle Monster Dimension","url":"https://rickandmortyapi.com/api/location/21"},"image":"https://rickandmortyapi.com/api/character/avatar/7.jpeg","episode":["https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/11"],"url":"https://rickandmortyapi.com/api/character/7","created":"2017-11-04T19:59:20.523Z"},{"id":8,"name":"Adjudicator Rick","status":"Dead","species":"Human","type":"","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/8.jpeg","episode":["https://rickandmortyapi.com/api/episode/28"],"url":"https://rickandmortyapi.com/api/character/8","created":"2017-11-04T20:03:34.737Z"},{"id":9,"name":"Agency Director","status":"Dead","species":"Human","type":"","gender":"Male","origin":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/9.jpeg","episode":["https://rickandmortyapi.com/api/episode/24"],"url":"https://rickandmortyapi.com/api/character/9","created":"2017-11-04T20:06:54.976Z"},{"id":10,"name":"Alan Rails","status":"Dead","species":"Human","type":"Superhuman (Ghost trains summoner)","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Worldender's lair","url":"https://rickandmortyapi.com/api/location/4"},"image":"https://rickandmortyapi.com/api/character/avatar/10.jpeg","episode":["https://rickandmortyapi.com/api/episode/25"],"url":"https://rickandmortyapi.com/api/character/10","created":"2017-11-04T20:19:09.017Z"},{"id":11,"name":"Albert Einstein","status":"Dead","species":"Human","type":"","gender":"Male","origin":{"name":"Earth (C-137)","url":"https://rickandmortyapi.com/api/location/1"},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/11.jpeg","episode":["https://rickandmortyapi.com/api/episode/12"],"url":"https://rickandmortyapi.com/api/character/11","created":"2017-11-04T20:20:20.965Z"},{"id":12,"name":"Alexander","status":"Dead","species":"Human","type":"","gender":"Male","origin":{"name":"Earth (C-137)","url":"https://rickandmortyapi.com/api/location/1"},"location":{"name":"Anatomy Park","url":"https://rickandmortyapi.com/api/location/5"},"image":"https://rickandmortyapi.com/api/character/avatar/12.jpeg","episode":["https://rickandmortyapi.com/api/episode/3"],"url":"https://rickandmortyapi.com/api/character/12","created":"2017-11-04T20:32:33.144Z"},{"id":13,"name":"Alien Googah","status":"unknown","species":"Alien","type":"","gender":"unknown","origin":{"name":"unknown","url":""},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/13.jpeg","episode":["https://rickandmortyapi.com/api/episode/31"],"url":"https://rickandmortyapi.com/api/character/13","created":"2017-11-04T20:33:30.779Z"},{"id":14,"name":"Alien Morty","status":"unknown","species":"Alien","type":"","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/14.jpeg","episode":["https://rickandmortyapi.com/api/episode/10"],"url":"https://rickandmortyapi.com/api/character/14","created":"2017-11-04T20:51:31.373Z"},{"id":15,"name":"Alien Rick","status":"unknown","species":"Alien","type":"","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/15.jpeg","episode":["https://rickandmortyapi.com/api/episode/10"],"url":"https://rickandmortyapi.com/api/character/15","created":"2017-11-04T20:56:13.215Z"},{"id":16,"name":"Amish Cyborg","status":"Dead","species":"Alien","type":"Parasite","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Earth (Replacement Dimension)","url":"https://rickandmortyapi.com/api/location/20"},"image":"https://rickandmortyapi.com/api/character/avatar/16.jpeg","episode":["https://rickandmortyapi.com/api/episode/15"],"url":"https://rickandmortyapi.com/api/character/16","created":"2017-11-04T21:12:45.235Z"},{"id":17,"name":"Annie","status":"Alive","species":"Human","type":"","gender":"Female","origin":{"name":"Earth (C-137)","url":"https://rickandmortyapi.com/api/location/1"},"location":{"name":"Anatomy Park","url":"https://rickandmortyapi.com/api/location/5"},"image":"https://rickandmortyapi.com/api/character/avatar/17.jpeg","episode":["https://rickandmortyapi.com/api/episode/3"],"url":"https://rickandmortyapi.com/api/character/17","created":"2017-11-04T22:21:24.481Z"},{"id":18,"name":"Antenna Morty","status":"Alive","species":"Human","type":"Human with antennae","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Citadel of Ricks","url":"https://rickandmortyapi.com/api/location/3"},"image":"https://rickandmortyapi.com/api/character/avatar/18.jpeg","episode":["https://rickandmortyapi.com/api/episode/10","https://rickandmortyapi.com/api/episode/28"],"url":"https://rickandmortyapi.com/api/character/18","created":"2017-11-04T22:25:29.008Z"},{"id":19,"name":"Antenna Rick","status":"unknown","species":"Human","type":"Human with antennae","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"unknown","url":""},"image":"https://rickandmortyapi.com/api/character/avatar/19.jpeg","episode":["https://rickandmortyapi.com/api/episode/10"],"url":"https://rickandmortyapi.com/api/character/19","created":"2017-11-04T22:28:13.756Z"},{"id":20,"name":"Ants in my Eyes Johnson","status":"unknown","species":"Human","type":"Human with ants in his eyes","gender":"Male","origin":{"name":"unknown","url":""},"location":{"name":"Interdimensional Cable","url":"https://rickandmortyapi.com/api/location/6"},"image":"https://rickandmortyapi.com/api/character/avatar/20.jpeg","episode":["https://rickandmortyapi.com/api/episode/8"],"url":"https://rickandmortyapi.com/api/character/20","created":"2017-11-04T22:34:53.659Z"}]} -------------------------------------------------------------------------------- /sample/simple.json: -------------------------------------------------------------------------------- 1 | {"status":"Ok","data":{"a":1,"b":false}} --------------------------------------------------------------------------------