1 #ifndef __JSON__H 2 #define __JSON__H 3 4 #include "lib/output_buffer.h" 5 6 struct json_object; 7 struct json_array; 8 struct json_pair; 9 10 #define JSON_TYPE_STRING 0 11 #define JSON_TYPE_INTEGER 1 12 #define JSON_TYPE_FLOAT 2 13 #define JSON_TYPE_OBJECT 3 14 #define JSON_TYPE_ARRAY 4 15 #define JSON_PARENT_TYPE_PAIR 0 16 #define JSON_PARENT_TYPE_ARRAY 1 17 struct json_value { 18 int type; 19 union { 20 long long integer_number; 21 double float_number; 22 char *string; 23 struct json_object *object; 24 struct json_array *array; 25 }; 26 int parent_type; 27 union { 28 struct json_pair *parent_pair; 29 struct json_array *parent_array; 30 }; 31 }; 32 33 struct json_array { 34 struct json_value **values; 35 int value_cnt; 36 struct json_value *parent; 37 }; 38 39 struct json_object { 40 struct json_pair **pairs; 41 int pair_cnt; 42 struct json_value *parent; 43 }; 44 45 struct json_pair { 46 char *name; 47 struct json_value *value; 48 struct json_object *parent; 49 }; 50 51 struct json_object *json_create_object(void); 52 struct json_array *json_create_array(void); 53 54 void json_free_object(struct json_object *obj); 55 56 int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...); 57 #define json_object_add_value_int(obj, name, val) \ 58 json_object_add_value_type((obj), name, JSON_TYPE_INTEGER, (long long) (val)) 59 #define json_object_add_value_float(obj, name, val) \ 60 json_object_add_value_type((obj), name, JSON_TYPE_FLOAT, (val)) 61 #define json_object_add_value_string(obj, name, val) \ 62 json_object_add_value_type((obj), name, JSON_TYPE_STRING, (val)) 63 #define json_object_add_value_object(obj, name, val) \ 64 json_object_add_value_type((obj), name, JSON_TYPE_OBJECT, (val)) 65 #define json_object_add_value_array(obj, name, val) \ 66 json_object_add_value_type((obj), name, JSON_TYPE_ARRAY, (val)) 67 int json_array_add_value_type(struct json_array *array, int type, ...); 68 #define json_array_add_value_int(obj, val) \ 69 json_array_add_value_type((obj), JSON_TYPE_INTEGER, (val)) 70 #define json_array_add_value_float(obj, val) \ 71 json_array_add_value_type((obj), JSON_TYPE_FLOAT, (val)) 72 #define json_array_add_value_string(obj, val) \ 73 json_array_add_value_type((obj), JSON_TYPE_STRING, (val)) 74 #define json_array_add_value_object(obj, val) \ 75 json_array_add_value_type((obj), JSON_TYPE_OBJECT, (val)) 76 #define json_array_add_value_array(obj, val) \ 77 json_array_add_value_type((obj), JSON_TYPE_ARRAY, (val)) 78 79 #define json_array_last_value_object(obj) \ 80 (obj->values[obj->value_cnt - 1]->object) 81 82 void json_print_object(struct json_object *obj, struct buf_output *out); 83 #endif 84