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