http://www.json.org/为官网地址
1,键、值 对的集合,可以被看作是对象,记录,字典,散列表等
2,有序列表,实现为数组,向量或列表
格式如下:
对象:{string:value,string1:value1,string2:value2}
数组:{string:[{value},{value1},{value2}]},
数组中的value可以是各种形式,string:value,string1:value1
json的组成类似与搭积木形式
一,积木的属性
struct json_object
{
enum json_type o_type; json的类型,一般为对象或数组
typedef enum json_type {
json_type_null,
json_type_boolean,
json_type_double,
json_type_int,
json_type_object,
json_type_array,
json_type_string
} json_type;
json_object_delete_fn *_delete; json的删除函数指针
json_object_to_json_string_fn *_to_json_string;
int _ref_count; 引用次数,新建为1,get加1,put减1
delete是判断是否为0去free
struct printbuf *_pb; 内容为字符串,包括字符串内容和长度
union data { 对象内的value,可能是哈希或数组等
boolean c_boolean;
double c_double;
int c_int;
struct lh_table *c_object;
struct array_list *c_array;
char *c_string;
} o;
};
二,生产积木
我们可以从一个数据生产为一个json对象
字符串和长度,转为json格式并返回json指针
new_obj = json_tokener_parse_ex(tok, buf, buflen);
文件,从文件读取json返回json指针,返回的json类型会根据内容不同而不同
new_obj = json_object_from_file(full_file);
将json对象写入到文件中,file为文件的位置
json_object_to_file(file, obj);
创建一个json对象
new_obj = json_object_new_object();
将json对象变为json字符串
json_object_to_json_string(obj)
引用次数减一,影响delete的释放
json_object_put(obj);
引用次数加一,影响delete的释放
json_object_get(obj)
获取json对象的value内容存放的哈希表
json_object_get_object(obj);
获取json对象的类型
return json_object_get_type(obj);
判断json对象的类型
json_object_is_type(obj, type);
创建一个数组json对象,会将一些方法也创建
struct json_object* json_object_new_array(void)
{
struct json_object *jso = json_object_new(json_type_array);
if(!jso) return NULL;
jso->_delete = &json_object_array_delete;
jso->_to_json_string = &json_object_array_to_json_string;
jso->o.c_array = array_list_new(&json_object_array_entry_free);
return jso;
}
........
三,搭积木
在json对象上面,添加键值对
json_object_object_add(obj, key, val);
在数组json对象上的idx的下标上添加对象
json_object_array_put_idx(obj, idx, val);
..........
获取json对象的键对应的值
json_object_object_get(obj, key);
删除json对象上的key
lh_table_delete(jso->o.c_object, key);
...............
每次new创建的时候都是会申请内存的,put操作会将引用次数减1,还会继续调用json在创建时候的删除函数,进行删除
那么如果多次创建然后添加到一个对象上,由于是链树结构,delete函数会将一个对象上的所有子节点的子节点都循环
遍历,减去引用次数,然后调用delete函数,就是put函数的循环递归
由于json类型不同,object和array的释放是不同的,如果array拿object释放,只会释放掉掉数组的一个对象