c语言json的使用

http://www.json.org/为官网地址


json是一种轻量级的数据交换格式,主要建立在两个结构上
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释放,只会释放掉掉数组的一个对象



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值