json-c库使用总结
1. json_object_get与json_object_put函数
struct json_object* json_object_get(struct json_object *jso); // 将json对象的引用计数加1,返回jso自身
void json_object_put(struct json_object *jso); // 将jso对象的引用计数减1。此时如果json的引用计数大于0,直接返回; 如果json的引用计数为0,则递归的对每个子对象的引用计数减1,子对象引用计数为0时释放所占用内存。
注:如果对json对象显式调用了json_object_get,之后必须成对调用json_object_put,否则将导致该json对象所占用内存泄漏。
2. json_object_new_XXX系列函数 struct json_object* json_object_new_object(void);
struct json_object* json_object_new_int(int i);
struct json_object* json_object_new_double(double d);
struct json_object* json_object_new_array(void);
struct json_object* json_object_new_string(const char *s);
struct json_object* json_object_new_string_len(const char *s, int len);
json_object_new_XXX系列函数用来创建XXX类型的json对象,创建的json对象默认引用计数为1,因此在该对象使用完后也需要调用一次json_object_put来把引用计数置0,从而释放内存。
3. json_tokener_parse函数
struct json_object* json_tokener_parse(const char *str);
json_tokener_parse将符合json格式的字符串构造为一个json对象,构造的json对象默认引用计数为1,同样需要在使用完后对该对象调用一次json_object_put。
4. is_error宏
is_error(jso)
如果传入的字符串是非法的json格式,错误判断应该使用is_error宏,而非 if(NULL != jso),CGI中目前有很多这种错误用法(虽然好像没引发什么问题)
5. json_object_object_XXX函数
void json_object_object_del(struct json_object* jso, const char *key);
从jso对象中删除键值为key的子对象,并释放该子对象及键值所占的内存(注:可能有文档说json_object_object_del只是删除而不释放内存,但实际上这是错误的)。
struct json_object* json_object_object_get(struct json_object* jso, const char *key); 从jso中获取键值为key的子对象。错误判断同样应该用is_error(jso)宏。
void json_object_object_add(struct json_object* jso, const char *key, struct json_object *val); 更新键值为key的子项的值。整个过程实际上是这样的:先从jso中删除并释放键值key及其值的内存,然后重新分配内存添加键值和新的值,所以json_object_object_add是包含json_object_object_del操作的。
6. json_object_get_XXX系列函数
struct lh_table* json_object_get_object(struct json_object *jso);
const char* json_object_get_string(struct json_object *jso);
int json_object_get_int(struct json_object *jso);
double json_object_get_double(struct json_object *jso); 这类函数只是获取json对象的实际数据内容,不更新引用计数,也不分配内存。
7. json_object_array_XXX系列函数
struct json_object* json_object_array_get_sub_array(struct json_object *jso, int start_idx, int number);
这个函数用来从一个json数组对象中取数组序号start_idx开始的、总共number长度的子数组对象。分页显示功能常用到。注:返回的子数组是有重新分配内存的,所以同样要对返回的json_object*做一次json_object_put操作来释放内存。
int json_object_array_add(struct json_object *jso,struct json_object *val); 向数组中添加一个值。
int json_object_array_length(struct json_object *jso); 获取数组长度。
int json_object_array_put_idx(struct json_object *jso, int idx, struct json_object *val); 更新数组中序号为idx那一项的值,老的值同样会先被释放。
struct json_object* json_object_array_get_idx(struct json_object *jso, int idx); 获取数组中序号为idx那一项的json对象,不更新引用计数,也不分配内存。
struct json_object* json_object_array_sort(struct json_object *jso, const char *keyname, int sord ); 根据键值为keyname的项的值进行升序或降序排序,只是改变数组成员的顺序,不更新引用计数,也不分配内存。
json-c库使用总结相关推荐
- 新JSON绑定库JSON-B发布公开预览版
JSON-B这个有望添加到Java EE 8的JSON绑定库发布了公开预览版.该库以JSON Processing(不要同JSONP或JSON-with-padding混淆)为基础构建,旨在为诸如Ja ...
- python json库函数_python基础之JSON标准库
一.序列化的一些简单概念 我们平常使用的python对象所进行的操作是在内存中,当程序关闭就会被清空,所以我们需要用一种合适的方法将这些数据保存下来. 为了将我们的数据进行永久存储,需要引入序列化(p ...
- gson解析天气json_几种常用JSON解析库性能比较
PS:公众号推文时间工作日早晨8点50分,周末下午3点30分,不见不散哈! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Jav ...
- json支持的最大长度_Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】...
Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fast ...
- Node.js中package.json中库的版本号详解(^和~区别)
Node.js中package.json中库的版本号详解(^和~区别) 当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号 ...
- C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
- 黑马程序员python笔记_#华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库...
[小宅按]在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化. ...
- python通过tkinter和json界面库实现考研知识点统计
python通过tkinter和json界面库实现考研知识点统计 使用下列代码前必须安装tkinter和json库 一.实现简单界面: """ from tkinter ...
- Delphi语言最好的JSON代码库 mORMot学习笔记1
mORMot没有控件安装,直接添加到lib路径, 工程中直接添加syncommons,syndb等到uses里 -------------------------------------------- ...
- [转]C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
最新文章
- GridView里面的HyperLink和ButtonField操作总结
- CentOS 7 安装Golang
- 考oracle ocm,Oracle数据库OCM考试系列教程与总结_OCM考试实验笔记
- qt连接mysql创建表_Qt编译mysql以及创建表后进行导入操作
- C++设计模式之Template Method(模板方法模式)
- 优化MyBatis配置文件中的配置
- Windows安装MySQL 5.7.19及相关问题处理
- 【重点!DP】LeetCode 115. Distinct Subsequences
- java编程 数组的中位数中枢_Java算法题1:找出两个有序数组的中位数?
- 基础的数据处理(1)—出租车数据的基础处理,由gps生成OD(pandas)
- wifi扫描流程图_一种wifi扫描阶段进行身份识别的认证方法
- Java使用EasyExcel下载xls、xlsx 出现文件格式与扩展名不匹配
- 利用Python制作证件照
- 【python】王者荣耀全英雄高清壁纸爬虫共467M(多线程)
- GAMES101第四讲Transformation Cont.笔记
- MySQL备份恢复之mysqldump恢复
- 51单片机入门教程(1)——点亮一个LED灯
- 关于文字转base64,base64转文字的坑(数字短信)
- ubuntu 桌面菜单栏和任务栏程序标题栏都不见了
- k8s dashboard token过期时间太短的解决方案