1 /* 2 * $Id: json_object.c,v 1.17 2006/07/25 03:24:50 mclark Exp $ 3 * 4 * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. 5 * Michael Clark <michael (at) metaparadigm.com> 6 * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. 7 * 8 * This library is free software; you can redistribute it and/or modify 9 * it under the terms of the MIT license. See COPYING for details. 10 * 11 */ 12 13 #include "config.h" 14 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <stddef.h> 18 #include <string.h> 19 #include <math.h> 20 #include <errno.h> 21 22 #include "debug.h" 23 #include "printbuf.h" 24 #include "linkhash.h" 25 #include "arraylist.h" 26 #include "json_inttypes.h" 27 #include "json_object.h" 28 #include "json_object_private.h" 29 #include "json_util.h" 30 #include "math_compat.h" 31 32 #if !defined(HAVE_STRDUP) && defined(_MSC_VER) 33 /* MSC has the version as _strdup */ 34 # define strdup _strdup 35 #elif !defined(HAVE_STRDUP) 36 # error You do not have strdup on your system. 37 #endif /* HAVE_STRDUP */ 38 39 #if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) 40 /* MSC has the version as _snprintf */ 41 # define snprintf _snprintf 42 #elif !defined(HAVE_SNPRINTF) 43 # error You do not have snprintf on your system. 44 #endif /* HAVE_SNPRINTF */ 45 46 // Don't define this. It's not thread-safe. 47 /* #define REFCOUNT_DEBUG 1 */ 48 49 const char *json_number_chars = "0123456789.+-eE"; 50 const char *json_hex_chars = "0123456789abcdefABCDEF"; 51 52 static void json_object_generic_delete(struct json_object* jso); 53 static struct json_object* json_object_new(enum json_type o_type); 54 55 static json_object_to_json_string_fn json_object_object_to_json_string; 56 static json_object_to_json_string_fn json_object_boolean_to_json_string; 57 static json_object_to_json_string_fn json_object_int_to_json_string; 58 static json_object_to_json_string_fn json_object_double_to_json_string; 59 static json_object_to_json_string_fn json_object_string_to_json_string; 60 static json_object_to_json_string_fn json_object_array_to_json_string; 61 62 63 /* ref count debugging */ 64 65 #ifdef REFCOUNT_DEBUG 66 67 static struct lh_table *json_object_table; 68 69 static void json_object_init(void) __attribute__ ((constructor)); 70 static void json_object_init(void) { 71 MC_DEBUG("json_object_init: creating object table\n"); 72 json_object_table = lh_kptr_table_new(128, "json_object_table", NULL); 73 } 74 75 static void json_object_fini(void) __attribute__ ((destructor)); 76 static void json_object_fini(void) 77 { 78 struct lh_entry *ent; 79 if (MC_GET_DEBUG()) 80 { 81 if (json_object_table->count) 82 { 83 MC_DEBUG("json_object_fini: %d referenced objects at exit\n", 84 json_object_table->count); 85 lh_foreach(json_object_table, ent) 86 { 87 struct json_object* obj = (struct json_object*)ent->v; 88 MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj); 89 } 90 } 91 } 92 MC_DEBUG("json_object_fini: freeing object table\n"); 93 lh_table_free(json_object_table); 94 } 95 #endif /* REFCOUNT_DEBUG */ 96 97 98 /* string escaping */ 99 100 static int json_escape_str(struct printbuf *pb, char *str, int len) 101 { 102 int pos = 0, start_offset = 0; 103 unsigned char c; 104 while (len--) 105 { 106 c = str[pos]; 107 switch(c) 108 { 109 case '\b': 110 case '\n': 111 case '\r': 112 case '\t': 113 case '\f': 114 case '"': 115 case '\\': 116 case '/': 117 if(pos - start_offset > 0) 118 printbuf_memappend(pb, str + start_offset, pos - start_offset); 119 120 if(c == '\b') printbuf_memappend(pb, "\\b", 2); 121 else if(c == '\n') printbuf_memappend(pb, "\\n", 2); 122 else if(c == '\r') printbuf_memappend(pb, "\\r", 2); 123 else if(c == '\t') printbuf_memappend(pb, "\\t", 2); 124 else if(c == '\f') printbuf_memappend(pb, "\\f", 2); 125 else if(c == '"') printbuf_memappend(pb, "\\\"", 2); 126 else if(c == '\\') printbuf_memappend(pb, "\\\\", 2); 127 else if(c == '/') printbuf_memappend(pb, "\\/", 2); 128 129 start_offset = ++pos; 130 break; 131 default: 132 if(c < ' ') 133 { 134 if(pos - start_offset > 0) 135 printbuf_memappend(pb, str + start_offset, pos - start_offset); 136 sprintbuf(pb, "\\u00%c%c", 137 json_hex_chars[c >> 4], 138 json_hex_chars[c & 0xf]); 139 start_offset = ++pos; 140 } else 141 pos++; 142 } 143 } 144 if (pos - start_offset > 0) 145 printbuf_memappend(pb, str + start_offset, pos - start_offset); 146 return 0; 147 } 148 149 150 /* reference counting */ 151 152 extern struct json_object* json_object_get(struct json_object *jso) 153 { 154 if (jso) 155 jso->_ref_count++; 156 return jso; 157 } 158 159 int json_object_put(struct json_object *jso) 160 { 161 if(jso) 162 { 163 jso->_ref_count--; 164 if(!jso->_ref_count) 165 { 166 if (jso->_user_delete) 167 jso->_user_delete(jso, jso->_userdata); 168 jso->_delete(jso); 169 return 1; 170 } 171 } 172 return 0; 173 } 174 175 176 /* generic object construction and destruction parts */ 177 178 static void json_object_generic_delete(struct json_object* jso) 179 { 180 #ifdef REFCOUNT_DEBUG 181 MC_DEBUG("json_object_delete_%s: %p\n", 182 json_type_to_name(jso->o_type), jso); 183 lh_table_delete(json_object_table, jso); 184 #endif /* REFCOUNT_DEBUG */ 185 printbuf_free(jso->_pb); 186 free(jso); 187 } 188 189 static struct json_object* json_object_new(enum json_type o_type) 190 { 191 struct json_object *jso; 192 193 jso = (struct json_object*)calloc(sizeof(struct json_object), 1); 194 if (!jso) 195 return NULL; 196 jso->o_type = o_type; 197 jso->_ref_count = 1; 198 jso->_delete = &json_object_generic_delete; 199 #ifdef REFCOUNT_DEBUG 200 lh_table_insert(json_object_table, jso, jso); 201 MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso); 202 #endif /* REFCOUNT_DEBUG */ 203 return jso; 204 } 205 206 207 /* type checking functions */ 208 209 int json_object_is_type(struct json_object *jso, enum json_type type) 210 { 211 if (!jso) 212 return (type == json_type_null); 213 return (jso->o_type == type); 214 } 215 216 enum json_type json_object_get_type(struct json_object *jso) 217 { 218 if (!jso) 219 return json_type_null; 220 return jso->o_type; 221 } 222 223 /* set a custom conversion to string */ 224 225 void json_object_set_serializer(json_object *jso, 226 json_object_to_json_string_fn to_string_func, 227 void *userdata, 228 json_object_delete_fn *user_delete) 229 { 230 // First, clean up any previously existing user info 231 if (jso->_user_delete) 232 { 233 jso->_user_delete(jso, jso->_userdata); 234 } 235 jso->_userdata = NULL; 236 jso->_user_delete = NULL; 237 238 if (to_string_func == NULL) 239 { 240 // Reset to the standard serialization function 241 switch(jso->o_type) 242 { 243 case json_type_null: 244 jso->_to_json_string = NULL; 245 break; 246 case json_type_boolean: 247 jso->_to_json_string = &json_object_boolean_to_json_string; 248 break; 249 case json_type_double: 250 jso->_to_json_string = &json_object_double_to_json_string; 251 break; 252 case json_type_int: 253 jso->_to_json_string = &json_object_int_to_json_string; 254 break; 255 case json_type_object: 256 jso->_to_json_string = &json_object_object_to_json_string; 257 break; 258 case json_type_array: 259 jso->_to_json_string = &json_object_array_to_json_string; 260 break; 261 case json_type_string: 262 jso->_to_json_string = &json_object_string_to_json_string; 263 break; 264 } 265 return; 266 } 267 268 jso->_to_json_string = to_string_func; 269 jso->_userdata = userdata; 270 jso->_user_delete = user_delete; 271 } 272 273 274 /* extended conversion to string */ 275 276 const char* json_object_to_json_string_ext(struct json_object *jso, int flags) 277 { 278 if (!jso) 279 return "null"; 280 281 if ((!jso->_pb) && !(jso->_pb = printbuf_new())) 282 return NULL; 283 284 printbuf_reset(jso->_pb); 285 286 if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0) 287 return NULL; 288 289 return jso->_pb->buf; 290 } 291 292 /* backwards-compatible conversion to string */ 293 294 const char* json_object_to_json_string(struct json_object *jso) 295 { 296 return json_object_to_json_string_ext(jso, JSON_C_TO_STRING_SPACED); 297 } 298 299 static void indent(struct printbuf *pb, int level, int flags) 300 { 301 if (flags & JSON_C_TO_STRING_PRETTY) 302 { 303 printbuf_memset(pb, -1, ' ', level * 2); 304 } 305 } 306 307 /* json_object_object */ 308 309 static int json_object_object_to_json_string(struct json_object* jso, 310 struct printbuf *pb, 311 int level, 312 int flags) 313 { 314 int had_children = 0; 315 struct json_object_iter iter; 316 317 sprintbuf(pb, "{" /*}*/); 318 if (flags & JSON_C_TO_STRING_PRETTY) 319 sprintbuf(pb, "\n"); 320 json_object_object_foreachC(jso, iter) 321 { 322 if (had_children) 323 { 324 sprintbuf(pb, ","); 325 if (flags & JSON_C_TO_STRING_PRETTY) 326 sprintbuf(pb, "\n"); 327 } 328 had_children = 1; 329 if (flags & JSON_C_TO_STRING_SPACED) 330 sprintbuf(pb, " "); 331 indent(pb, level+1, flags); 332 sprintbuf(pb, "\""); 333 json_escape_str(pb, iter.key, strlen(iter.key)); 334 if (flags & JSON_C_TO_STRING_SPACED) 335 sprintbuf(pb, "\": "); 336 else 337 sprintbuf(pb, "\":"); 338 if(iter.val == NULL) 339 sprintbuf(pb, "null"); 340 else 341 iter.val->_to_json_string(iter.val, pb, level+1,flags); 342 } 343 if (flags & JSON_C_TO_STRING_PRETTY) 344 { 345 if (had_children) 346 sprintbuf(pb, "\n"); 347 indent(pb,level,flags); 348 } 349 if (flags & JSON_C_TO_STRING_SPACED) 350 return sprintbuf(pb, /*{*/ " }"); 351 else 352 return sprintbuf(pb, /*{*/ "}"); 353 } 354 355 356 static void json_object_lh_entry_free(struct lh_entry *ent) 357 { 358 free(ent->k); 359 json_object_put((struct json_object*)ent->v); 360 } 361 362 static void json_object_object_delete(struct json_object* jso) 363 { 364 lh_table_free(jso->o.c_object); 365 json_object_generic_delete(jso); 366 } 367 368 struct json_object* json_object_new_object(void) 369 { 370 struct json_object *jso = json_object_new(json_type_object); 371 if (!jso) 372 return NULL; 373 jso->_delete = &json_object_object_delete; 374 jso->_to_json_string = &json_object_object_to_json_string; 375 jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES, 376 NULL, &json_object_lh_entry_free); 377 if (!jso->o.c_object) 378 { 379 json_object_generic_delete(jso); 380 errno = ENOMEM; 381 return NULL; 382 } 383 return jso; 384 } 385 386 struct lh_table* json_object_get_object(struct json_object *jso) 387 { 388 if (!jso) 389 return NULL; 390 switch(jso->o_type) 391 { 392 case json_type_object: 393 return jso->o.c_object; 394 default: 395 return NULL; 396 } 397 } 398 399 void json_object_object_add(struct json_object* jso, const char *key, 400 struct json_object *val) 401 { 402 // We lookup the entry and replace the value, rather than just deleting 403 // and re-adding it, so the existing key remains valid. 404 json_object *existing_value = NULL; 405 struct lh_entry *existing_entry; 406 existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key); 407 if (!existing_entry) 408 { 409 lh_table_insert(jso->o.c_object, strdup(key), val); 410 return; 411 } 412 existing_value = (void *)existing_entry->v; 413 if (existing_value) 414 json_object_put(existing_value); 415 existing_entry->v = val; 416 } 417 418 int json_object_object_length(struct json_object *jso) 419 { 420 return lh_table_length(jso->o.c_object); 421 } 422 423 struct json_object* json_object_object_get(struct json_object* jso, const char *key) 424 { 425 struct json_object *result = NULL; 426 json_object_object_get_ex(jso, key, &result); 427 return result; 428 } 429 430 json_bool json_object_object_get_ex(struct json_object* jso, const char *key, struct json_object **value) 431 { 432 if (value != NULL) 433 *value = NULL; 434 435 if (NULL == jso) 436 return FALSE; 437 438 switch(jso->o_type) 439 { 440 case json_type_object: 441 return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value); 442 default: 443 if (value != NULL) 444 *value = NULL; 445 return FALSE; 446 } 447 } 448 449 void json_object_object_del(struct json_object* jso, const char *key) 450 { 451 lh_table_delete(jso->o.c_object, key); 452 } 453 454 455 /* json_object_boolean */ 456 457 static int json_object_boolean_to_json_string(struct json_object* jso, 458 struct printbuf *pb, 459 int level, 460 int flags) 461 { 462 if (jso->o.c_boolean) 463 return sprintbuf(pb, "true"); 464 else 465 return sprintbuf(pb, "false"); 466 } 467 468 struct json_object* json_object_new_boolean(json_bool b) 469 { 470 struct json_object *jso = json_object_new(json_type_boolean); 471 if (!jso) 472 return NULL; 473 jso->_to_json_string = &json_object_boolean_to_json_string; 474 jso->o.c_boolean = b; 475 return jso; 476 } 477 478 json_bool json_object_get_boolean(struct json_object *jso) 479 { 480 if (!jso) 481 return FALSE; 482 switch(jso->o_type) 483 { 484 case json_type_boolean: 485 return jso->o.c_boolean; 486 case json_type_int: 487 return (jso->o.c_int64 != 0); 488 case json_type_double: 489 return (jso->o.c_double != 0); 490 case json_type_string: 491 return (jso->o.c_string.len != 0); 492 default: 493 return FALSE; 494 } 495 } 496 497 498 /* json_object_int */ 499 500 static int json_object_int_to_json_string(struct json_object* jso, 501 struct printbuf *pb, 502 int level, 503 int flags) 504 { 505 return sprintbuf(pb, "%"PRId64, jso->o.c_int64); 506 } 507 508 struct json_object* json_object_new_int(int32_t i) 509 { 510 struct json_object *jso = json_object_new(json_type_int); 511 if (!jso) 512 return NULL; 513 jso->_to_json_string = &json_object_int_to_json_string; 514 jso->o.c_int64 = i; 515 return jso; 516 } 517 518 int32_t json_object_get_int(struct json_object *jso) 519 { 520 int64_t cint64; 521 enum json_type o_type; 522 523 if(!jso) return 0; 524 525 o_type = jso->o_type; 526 cint64 = jso->o.c_int64; 527 528 if (o_type == json_type_string) 529 { 530 /* 531 * Parse strings into 64-bit numbers, then use the 532 * 64-to-32-bit number handling below. 533 */ 534 if (json_parse_int64(jso->o.c_string.str, &cint64) != 0) 535 return 0; /* whoops, it didn't work. */ 536 o_type = json_type_int; 537 } 538 539 switch(o_type) { 540 case json_type_int: 541 /* Make sure we return the correct values for out of range numbers. */ 542 if (cint64 <= INT32_MIN) 543 return INT32_MIN; 544 else if (cint64 >= INT32_MAX) 545 return INT32_MAX; 546 else 547 return (int32_t)cint64; 548 case json_type_double: 549 return (int32_t)jso->o.c_double; 550 case json_type_boolean: 551 return jso->o.c_boolean; 552 default: 553 return 0; 554 } 555 } 556 557 struct json_object* json_object_new_int64(int64_t i) 558 { 559 struct json_object *jso = json_object_new(json_type_int); 560 if (!jso) 561 return NULL; 562 jso->_to_json_string = &json_object_int_to_json_string; 563 jso->o.c_int64 = i; 564 return jso; 565 } 566 567 int64_t json_object_get_int64(struct json_object *jso) 568 { 569 int64_t cint; 570 571 if (!jso) 572 return 0; 573 switch(jso->o_type) 574 { 575 case json_type_int: 576 return jso->o.c_int64; 577 case json_type_double: 578 return (int64_t)jso->o.c_double; 579 case json_type_boolean: 580 return jso->o.c_boolean; 581 case json_type_string: 582 if (json_parse_int64(jso->o.c_string.str, &cint) == 0) 583 return cint; 584 default: 585 return 0; 586 } 587 } 588 589 590 /* json_object_double */ 591 592 static int json_object_double_to_json_string(struct json_object* jso, 593 struct printbuf *pb, 594 int level, 595 int flags) 596 { 597 char buf[128], *p, *q; 598 int size; 599 /* Although JSON RFC does not support 600 NaN or Infinity as numeric values 601 ECMA 262 section 9.8.1 defines 602 how to handle these cases as strings */ 603 if(isnan(jso->o.c_double)) 604 size = snprintf(buf, sizeof(buf), "NaN"); 605 else if(isinf(jso->o.c_double)) 606 if(jso->o.c_double > 0) 607 size = snprintf(buf, sizeof(buf), "Infinity"); 608 else 609 size = snprintf(buf, sizeof(buf), "-Infinity"); 610 else 611 size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double); 612 613 p = strchr(buf, ','); 614 if (p) { 615 *p = '.'; 616 } else { 617 p = strchr(buf, '.'); 618 } 619 if (p && (flags & JSON_C_TO_STRING_NOZERO)) { 620 /* last useful digit, always keep 1 zero */ 621 p++; 622 for (q=p ; *q ; q++) { 623 if (*q!='0') p=q; 624 } 625 /* drop trailing zeroes */ 626 *(++p) = 0; 627 size = p-buf; 628 } 629 printbuf_memappend(pb, buf, size); 630 return size; 631 } 632 633 struct json_object* json_object_new_double(double d) 634 { 635 struct json_object *jso = json_object_new(json_type_double); 636 if (!jso) 637 return NULL; 638 jso->_to_json_string = &json_object_double_to_json_string; 639 jso->o.c_double = d; 640 return jso; 641 } 642 643 struct json_object* json_object_new_double_s(double d, const char *ds) 644 { 645 struct json_object *jso = json_object_new_double(d); 646 if (!jso) 647 return NULL; 648 649 char *new_ds = strdup(ds); 650 if (!new_ds) 651 { 652 json_object_generic_delete(jso); 653 errno = ENOMEM; 654 return NULL; 655 } 656 json_object_set_serializer(jso, json_object_userdata_to_json_string, 657 new_ds, json_object_free_userdata); 658 return jso; 659 } 660 661 int json_object_userdata_to_json_string(struct json_object *jso, 662 struct printbuf *pb, int level, int flags) 663 { 664 int userdata_len = strlen(jso->_userdata); 665 printbuf_memappend(pb, jso->_userdata, userdata_len); 666 return userdata_len; 667 } 668 669 void json_object_free_userdata(struct json_object *jso, void *userdata) 670 { 671 free(userdata); 672 } 673 674 double json_object_get_double(struct json_object *jso) 675 { 676 double cdouble; 677 char *errPtr = NULL; 678 679 if(!jso) return 0.0; 680 switch(jso->o_type) { 681 case json_type_double: 682 return jso->o.c_double; 683 case json_type_int: 684 return jso->o.c_int64; 685 case json_type_boolean: 686 return jso->o.c_boolean; 687 case json_type_string: 688 errno = 0; 689 cdouble = strtod(jso->o.c_string.str,&errPtr); 690 691 /* if conversion stopped at the first character, return 0.0 */ 692 if (errPtr == jso->o.c_string.str) 693 return 0.0; 694 695 /* 696 * Check that the conversion terminated on something sensible 697 * 698 * For example, { "pay" : 123AB } would parse as 123. 699 */ 700 if (*errPtr != '\0') 701 return 0.0; 702 703 /* 704 * If strtod encounters a string which would exceed the 705 * capacity of a double, it returns +/- HUGE_VAL and sets 706 * errno to ERANGE. But +/- HUGE_VAL is also a valid result 707 * from a conversion, so we need to check errno. 708 * 709 * Underflow also sets errno to ERANGE, but it returns 0 in 710 * that case, which is what we will return anyway. 711 * 712 * See CERT guideline ERR30-C 713 */ 714 if ((HUGE_VAL == cdouble || -HUGE_VAL == cdouble) && 715 (ERANGE == errno)) 716 cdouble = 0.0; 717 return cdouble; 718 default: 719 return 0.0; 720 } 721 } 722 723 724 /* json_object_string */ 725 726 static int json_object_string_to_json_string(struct json_object* jso, 727 struct printbuf *pb, 728 int level, 729 int flags) 730 { 731 sprintbuf(pb, "\""); 732 json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len); 733 sprintbuf(pb, "\""); 734 return 0; 735 } 736 737 static void json_object_string_delete(struct json_object* jso) 738 { 739 free(jso->o.c_string.str); 740 json_object_generic_delete(jso); 741 } 742 743 struct json_object* json_object_new_string(const char *s) 744 { 745 struct json_object *jso = json_object_new(json_type_string); 746 if (!jso) 747 return NULL; 748 jso->_delete = &json_object_string_delete; 749 jso->_to_json_string = &json_object_string_to_json_string; 750 jso->o.c_string.str = strdup(s); 751 if (!jso->o.c_string.str) 752 { 753 json_object_generic_delete(jso); 754 errno = ENOMEM; 755 return NULL; 756 } 757 jso->o.c_string.len = strlen(s); 758 return jso; 759 } 760 761 struct json_object* json_object_new_string_len(const char *s, int len) 762 { 763 struct json_object *jso = json_object_new(json_type_string); 764 if (!jso) 765 return NULL; 766 jso->_delete = &json_object_string_delete; 767 jso->_to_json_string = &json_object_string_to_json_string; 768 jso->o.c_string.str = (char*)malloc(len + 1); 769 if (!jso->o.c_string.str) 770 { 771 json_object_generic_delete(jso); 772 errno = ENOMEM; 773 return NULL; 774 } 775 memcpy(jso->o.c_string.str, (void *)s, len); 776 jso->o.c_string.str[len] = '\0'; 777 jso->o.c_string.len = len; 778 return jso; 779 } 780 781 const char* json_object_get_string(struct json_object *jso) 782 { 783 if (!jso) 784 return NULL; 785 switch(jso->o_type) 786 { 787 case json_type_string: 788 return jso->o.c_string.str; 789 default: 790 return json_object_to_json_string(jso); 791 } 792 } 793 794 int json_object_get_string_len(struct json_object *jso) 795 { 796 if (!jso) 797 return 0; 798 switch(jso->o_type) 799 { 800 case json_type_string: 801 return jso->o.c_string.len; 802 default: 803 return 0; 804 } 805 } 806 807 808 /* json_object_array */ 809 810 static int json_object_array_to_json_string(struct json_object* jso, 811 struct printbuf *pb, 812 int level, 813 int flags) 814 { 815 int had_children = 0; 816 int ii; 817 sprintbuf(pb, "["); 818 if (flags & JSON_C_TO_STRING_PRETTY) 819 sprintbuf(pb, "\n"); 820 for(ii=0; ii < json_object_array_length(jso); ii++) 821 { 822 struct json_object *val; 823 if (had_children) 824 { 825 sprintbuf(pb, ","); 826 if (flags & JSON_C_TO_STRING_PRETTY) 827 sprintbuf(pb, "\n"); 828 } 829 had_children = 1; 830 if (flags & JSON_C_TO_STRING_SPACED) 831 sprintbuf(pb, " "); 832 indent(pb, level + 1, flags); 833 val = json_object_array_get_idx(jso, ii); 834 if(val == NULL) 835 sprintbuf(pb, "null"); 836 else 837 val->_to_json_string(val, pb, level+1, flags); 838 } 839 if (flags & JSON_C_TO_STRING_PRETTY) 840 { 841 if (had_children) 842 sprintbuf(pb, "\n"); 843 indent(pb,level,flags); 844 } 845 846 if (flags & JSON_C_TO_STRING_SPACED) 847 return sprintbuf(pb, " ]"); 848 else 849 return sprintbuf(pb, "]"); 850 } 851 852 static void json_object_array_entry_free(void *data) 853 { 854 json_object_put((struct json_object*)data); 855 } 856 857 static void json_object_array_delete(struct json_object* jso) 858 { 859 array_list_free(jso->o.c_array); 860 json_object_generic_delete(jso); 861 } 862 863 struct json_object* json_object_new_array(void) 864 { 865 struct json_object *jso = json_object_new(json_type_array); 866 if (!jso) 867 return NULL; 868 jso->_delete = &json_object_array_delete; 869 jso->_to_json_string = &json_object_array_to_json_string; 870 jso->o.c_array = array_list_new(&json_object_array_entry_free); 871 return jso; 872 } 873 874 struct array_list* json_object_get_array(struct json_object *jso) 875 { 876 if (!jso) 877 return NULL; 878 switch(jso->o_type) 879 { 880 case json_type_array: 881 return jso->o.c_array; 882 default: 883 return NULL; 884 } 885 } 886 887 void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *)) 888 { 889 array_list_sort(jso->o.c_array, sort_fn); 890 } 891 892 int json_object_array_length(struct json_object *jso) 893 { 894 return array_list_length(jso->o.c_array); 895 } 896 897 int json_object_array_add(struct json_object *jso,struct json_object *val) 898 { 899 return array_list_add(jso->o.c_array, val); 900 } 901 902 int json_object_array_put_idx(struct json_object *jso, int idx, 903 struct json_object *val) 904 { 905 return array_list_put_idx(jso->o.c_array, idx, val); 906 } 907 908 struct json_object* json_object_array_get_idx(struct json_object *jso, 909 int idx) 910 { 911 return (struct json_object*)array_list_get_idx(jso->o.c_array, idx); 912 } 913 914