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库使用总结相关推荐

  1. 新JSON绑定库JSON-B发布公开预览版

    JSON-B这个有望添加到Java EE 8的JSON绑定库发布了公开预览版.该库以JSON Processing(不要同JSONP或JSON-with-padding混淆)为基础构建,旨在为诸如Ja ...

  2. python json库函数_python基础之JSON标准库

    一.序列化的一些简单概念 我们平常使用的python对象所进行的操作是在内存中,当程序关闭就会被清空,所以我们需要用一种合适的方法将这些数据保存下来. 为了将我们的数据进行永久存储,需要引入序列化(p ...

  3. gson解析天气json_几种常用JSON解析库性能比较

    PS:公众号推文时间工作日早晨8点50分,周末下午3点30分,不见不散哈! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Jav ...

  4. json支持的最大长度_Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】...

    Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fast ...

  5. Node.js中package.json中库的版本号详解(^和~区别)

    Node.js中package.json中库的版本号详解(^和~区别) 当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号 ...

  6. C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  7. 黑马程序员python笔记_#华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库...

    [小宅按]在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化. ...

  8. python通过tkinter和json界面库实现考研知识点统计

    python通过tkinter和json界面库实现考研知识点统计 使用下列代码前必须安装tkinter和json库 一.实现简单界面: """ from tkinter ...

  9. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径, 工程中直接添加syncommons,syndb等到uses里 -------------------------------------------- ...

  10. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

最新文章

  1. GridView里面的HyperLink和ButtonField操作总结
  2. CentOS 7 安装Golang
  3. 考oracle ocm,Oracle数据库OCM考试系列教程与总结_OCM考试实验笔记
  4. qt连接mysql创建表_Qt编译mysql以及创建表后进行导入操作
  5. C++设计模式之Template Method(模板方法模式)
  6. 优化MyBatis配置文件中的配置
  7. Windows安装MySQL 5.7.19及相关问题处理
  8. 【重点!DP】LeetCode 115. Distinct Subsequences
  9. java编程 数组的中位数中枢_Java算法题1:找出两个有序数组的中位数?
  10. 基础的数据处理(1)—出租车数据的基础处理,由gps生成OD(pandas)
  11. wifi扫描流程图_一种wifi扫描阶段进行身份识别的认证方法
  12. Java使用EasyExcel下载xls、xlsx 出现文件格式与扩展名不匹配
  13. 利用Python制作证件照
  14. 【python】王者荣耀全英雄高清壁纸爬虫共467M(多线程)
  15. GAMES101第四讲Transformation Cont.笔记
  16. MySQL备份恢复之mysqldump恢复
  17. 51单片机入门教程(1)——点亮一个LED灯
  18. 关于文字转base64,base64转文字的坑(数字短信)
  19. ubuntu 桌面菜单栏和任务栏程序标题栏都不见了
  20. k8s dashboard token过期时间太短的解决方案

热门文章

  1. 代码需要不断进化和改变
  2. nginx操作指南之二
  3. Win7重启后IP地址无效
  4. Outlook Express设置方法
  5. SDUT - 2623 The number of steps(概率dp)
  6. 中石油训练赛 - 小A盗墓(线段树+异或结论)
  7. html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
  8. dataframe 加一行_虎牙公会是干嘛的?虎牙直播有必要加公会吗?
  9. Docker教程-使用
  10. 数据分析与挖掘理论-概述