| /* |
| * Tests if casting within the json_object_get_* functions work correctly. |
| * Also checks the json_object_get_type and json_object_is_type functions. |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include "config.h" |
| |
| #include "json_inttypes.h" |
| #include "json_object.h" |
| #include "json_tokener.h" |
| #include "json_util.h" |
| |
| static void getit(struct json_object *new_obj, const char *field); |
| static void checktype_header(void); |
| static void checktype(struct json_object *new_obj, const char *field); |
| |
| int main(int argc, char **argv) |
| { |
| const char *input = "{\n\ |
| \"string_of_digits\": \"123\",\n\ |
| \"regular_number\": 222,\n\ |
| \"decimal_number\": 99.55,\n\ |
| \"boolean_true\": true,\n\ |
| \"boolean_false\": false,\n\ |
| \"big_number\": 2147483649,\n\ |
| \"a_null\": null,\n\ |
| }"; |
| /* Note: 2147483649 = INT_MAX + 2 */ |
| |
| struct json_object *new_obj; |
| |
| new_obj = json_tokener_parse(input); |
| printf("Parsed input: %s\n", input); |
| printf("Result is %s\n", (new_obj == NULL) ? "NULL (error!)" : "not NULL"); |
| if (!new_obj) |
| return 1; // oops, we failed. |
| |
| getit(new_obj, "string_of_digits"); |
| getit(new_obj, "regular_number"); |
| getit(new_obj, "decimal_number"); |
| getit(new_obj, "boolean_true"); |
| getit(new_obj, "boolean_false"); |
| getit(new_obj, "big_number"); |
| getit(new_obj, "a_null"); |
| |
| // Now check the behaviour of the json_object_is_type() function. |
| printf("\n================================\n"); |
| checktype_header(); |
| checktype(new_obj, NULL); |
| checktype(new_obj, "string_of_digits"); |
| checktype(new_obj, "regular_number"); |
| checktype(new_obj, "decimal_number"); |
| checktype(new_obj, "boolean_true"); |
| checktype(new_obj, "boolean_false"); |
| checktype(new_obj, "big_number"); |
| checktype(new_obj, "a_null"); |
| |
| json_object_put(new_obj); |
| |
| return 0; |
| } |
| |
| static void getit(struct json_object *new_obj, const char *field) |
| { |
| struct json_object *o = json_object_object_get(new_obj, field); |
| |
| enum json_type o_type = json_object_get_type(o); |
| printf("new_obj.%s json_object_get_type()=%s\n", field, |
| json_type_to_name(o_type)); |
| printf("new_obj.%s json_object_get_int()=%d\n", field, |
| json_object_get_int(o)); |
| printf("new_obj.%s json_object_get_int64()=%" PRId64 "\n", field, |
| json_object_get_int64(o)); |
| printf("new_obj.%s json_object_get_boolean()=%d\n", field, |
| json_object_get_boolean(o)); |
| printf("new_obj.%s json_object_get_double()=%f\n", field, |
| json_object_get_double(o)); |
| } |
| |
| static void checktype_header() |
| { |
| printf("json_object_is_type: %s,%s,%s,%s,%s,%s,%s\n", |
| json_type_to_name(json_type_null), |
| json_type_to_name(json_type_boolean), |
| json_type_to_name(json_type_double), |
| json_type_to_name(json_type_int), |
| json_type_to_name(json_type_object), |
| json_type_to_name(json_type_array), |
| json_type_to_name(json_type_string)); |
| } |
| static void checktype(struct json_object *new_obj, const char *field) |
| { |
| struct json_object *o = field ? json_object_object_get(new_obj, field) : new_obj; |
| printf("new_obj%s%-18s: %d,%d,%d,%d,%d,%d,%d\n", |
| field ? "." : " ", field ? field : "", |
| json_object_is_type(o, json_type_null), |
| json_object_is_type(o, json_type_boolean), |
| json_object_is_type(o, json_type_double), |
| json_object_is_type(o, json_type_int), |
| json_object_is_type(o, json_type_object), |
| json_object_is_type(o, json_type_array), |
| json_object_is_type(o, json_type_string)); |
| } |