JSON库——parson

overview

下载源代码

parson是解析JSON格式的库,开发语言为c语言。

git clone https://github.com/kgabis/parson.git

特点:轻量级:仅有两个文件;

安装不是必须的依赖

在编译的过程中可能需要安装这个依赖,当然如果你不使用库中提供的demo,只想用库中的api,建议直接自己编写makefile编译出库文件;
如果你觉得需要看一下demo的运行效果,可能需要安装下面这个框架:
CUnit 是一个 C 语言单元测试框架,用于编写和执行单元测试。单元测试是一种软件测试方法,用于验证程序中最小可测试单元的正确性,例如函数、方法或模块。
网上有很多教程,不过不一定能起作用。毕竟环境不同,步骤一样也会得到异常;我使用的是ubuntu18.04,安装这个框架直接用了,下面这个命令就成功了:

sudo apt-get install libcunit1 libcunit1-doc libcunit1-dev

good luck to you!

应用实例

使用实例可以参考这个作者写的:c语言json库parson的介绍和使用,当然如果你有过使用json相关库的经历,直接参考api的解释就会写了。

parson object

JSON_Value
JSON_Object
JSON_Array

JSON_Value和JSON_Object

JSON_Value:JSON_Value 是 Parson 库中表示 JSON 值的基本数据类型。它可以表示 JSON 对象、JSON 数组、字符串、数字、布尔值或空值。JSON_Value 是一个通用的数据结构,用于表示 JSON 数据的不同类型。它可以通过不同的函数进行创建、获取和操作。
JSON_Object:JSON_Object 是 Parson 库中表示 JSON 对象的数据结构。JSON 对象是由一组键值对组成的无序集合,其中每个键都是唯一的。JSON_Object 用于表示和操作这些键值对。通过 JSON_Object,可以添加、获取和删除键值对,以及对键值对进行遍历和操作。

简而言之,JSON_Value 是表示 JSON 数据的单个值,而 JSON_Object 是表示 JSON 对象的集合。JSON_Value 可以是 JSON_Object 的一部分,例如,一个键的值可以是一个 JSON_Object,从而形成嵌套的 JSON 结构。

我的理解是JSON_Value*就好比是void类型的指针,它可以指向一个数组、结构体甚至其它,我就把它指向一个结构体吧。而这个结构体就是JSON_Object,它里面可以有很多种类型,甚至可以嵌套自己。

parson type

typedef int JSON_Status

parson API

注意:以下对API 的分类并不完全契合,有一些在不同的类别中也有使用,主要还是看用途吧,还有就是并不完全,但是以下的api能够实现基础的东西了,如果不满足可以在github上下载源码来看

解析

json_parse_sting

JSON_Value * json_parse_string(const char *string);
将字符串反序列为json对象,解析到的第一个JSON值保存在返回值中;

参数:字符串,比如 "{\"code\":0,\"flag\":true,\"msg\":\"success\"}"

返回值:失败:NULL

json_value_get_object

JSON_Object *   json_value_get_object (const JSON_Value *value);
从json对象中获取其中的object对象

参数:json对象

返回值:成功:返回指针类型对象;失败:返回JSONError

json_object_has_value

int json_object_has_value(const JSON_Object *object, const char *name);
判断object对象是否存在这个名字的值

参数:object:object对象;name:名字

返回值:存在:1;反之:0

json_object_has_value_of_type

int json_object_has_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type);


参数:object:object对象;name:名字;type:

返回值:存在:1;反之:0

json_object_get_number

double    json_object_get_number (const JSON_Object *object, const char *name);
获取object对象中名为name的值
参数:object:object对象;name:名字

返回值:失败:0;

json_object_get_boolean

int    json_object_get_boolean (const JSON_Object *object, const char *name);
获取object对象中名为name的值
参数:object:object对象;name:名字

返回值:失败:-1;

json_object_get_string

const char  * json_object_get_string (const JSON_Object *object, const char *name);
获取object对象中名为name的值
参数:object:object对象;name:名字

返回值:失败:-1;

json_object_get_string_len

size_t        json_object_get_string_len(const JSON_Object *object, const char *name); 
/* doesn't account for last null character */
获取object对象中名为name的字符串的长度

参数:object:object对象;name:名字

返回值:失败:-1;

json_object_get_object

JSON_Object * json_object_get_object (const JSON_Object *object, const char *name)
从JSON_Object对象中获取嵌套的JSON_Object对象

参数:object:object对象;name:嵌套的object对象的名字

返回值:失败:返回NULL

json_value_get_array

JSON_Array  *   json_value_get_array  (const JSON_Value *value)
从json对象中获取一个数组对象JSON_Array *;

参数:value:json对象

返回值:

json_parse_file

JSON_Value * json_parse_file(const char *filename);
/* Parses first JSON value in a file, returns NULL in case of error */

参数:filename:文件名

返回值:失败:NULL

释放内存

json_value_free

void   json_value_free (JSON_Value *value);
释放json对象所指向的内存

参数:value:json对象

json_free_serialized_string

void        json_free_serialized_string(char *string)
/* frees string from json_serialize_to_string and json_serialize_to_string_pretty */

参数:stirng:以上这串英文提到的生成的字符串


构建

json_value_init_object

JSON_Value * json_value_init_object (void);
初始化一个JSON_Value对象

json_object_set_value

JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value)
往对象object中添加名为name的json对象,json对象其实就是嵌套在这个object里的object

参数:object:JSON_Object对象【在构建过程中,json_value_get_object(JSON_Value *)获得或者其它途径】;name:json对象名;value:json对象

返回值:

json_object_set_number

JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
往对象object中添加name和给名为name的元素赋值

参数:object:JSON_Object对象;name:元素名;number:元素值

返回值:

json_object_set_string

JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
往对象object中添加name和给名为name的元素赋值

参数:object:JSON_Object对象;name:元素名;string:元素值

返回值:

json_object_set_string_with_len

区别于json_object_set_string

JSON_Status json_object_set_string_with_len(JSON_Object *object, const char *name, const char *string, size_t len);
这个规定了字符串的长度
参数:object:JSON_Object对象;name:元素名;string:元素值;len:string的长度

返回值:

json_object_set_boolean

JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean)
往对象object中添加name和给名为name的元素赋值

参数:object:JSON_Object对象;name:元素名;boolean:元素值

返回值:

json_object_set_null

JSON_Status json_object_set_null(JSON_Object *object, const char *name)
往对象object中添加name和给名为name的元素赋空值

参数:object:JSON_Object对象;name:元素名

返回值:

json_serialize_to_string

char *      json_serialize_to_string(const JSON_Value *value)
将构建好的json对象转换为字符串

参数:value:json对象

返回值:失败:NULL

json_value_init_array

JSON_Value * json_value_init_array  (void)
初始化一个有数组json对象;

返回值

json_serialize_to_file

JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename)
将构建的json格式数据保存到文件中

参数:value:构建好的json对象;filename:输出的文件名

返回值:


以下几个是往数组的最后位置添加新的元素

注意:json_array_append_value 是一个函数,用于将一个 JSON 值追加到 JSON 数组中。当使用该函数将值追加到数组时,它不会复制传递的值,而是将值的所有权转移给数组。这意味着,一旦你将值追加到数组中,你就不能再自行释放或修改该值。因为数组现在拥有该值,并且负责管理其内存。如果你在之后试图释放或修改该值,可能会导致内存错误或不可预测的行为。

json_array_append_value

JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value)
将一个json对象嵌入到一个数组中

参数:array:数组对象;value:json对象

返回值:

json_array_append_string

JSON_Status json_array_append_string(JSON_Array *array, const char *string);
将一个字符串类型数据添加到数组中

参数:array:数组对象;string:字符串;

返回值:

json_array_append_string_with_len

JSON_Status json_array_append_string_with_len(JSON_Array *array, const char *string, size_t len)
 /* length shouldn't include last null character */这句的意思是一般字符串的后面都会以"\0"作为终结符,但是这个长度并不包含这个符号

这个规定了字符串的长度
 

json_array_append_number

JSON_Status json_array_append_number(JSON_Array *array, double number)
将一个数值添加到数组中

json_array_append_boolean

JSON_Status json_array_append_boolean(JSON_Array *array, int boolean)
将一个布尔类型数值添加到数组中

json_array_append_null

JSON_Status json_array_append_null(JSON_Array *array)
将数组置空

获取数组中的元素

json_array_get_value

JSON_Value  * json_array_get_value  (const JSON_Array *array, size_t index);
获取数组中的json对象

参数:array:数组对象;index:json对像对应的下标

返回值:失败:-1

json_array_get_string

const char  * json_array_get_string (const JSON_Array *array, size_t index);
获取数组中的值

参数:array:数组对象;index:值对应的下标

返回值:失败:-1

json_array_get_string_len

size_t        json_array_get_string_len(const JSON_Array *array, size_t index); 
/* doesn't account for last null character */
获取数组中字符串的长度

参数:array:数组对象;index:字符串对应的下标

返回值:失败:-1

json_array_get_object

JSON_Object * json_array_get_object (const JSON_Array *array, size_t index);
获取数组中嵌套的object对象

参数:array:数组对象;index:值对应的下标

返回值:失败:-1

json_array_get_array

JSON_Array  * json_array_get_array  (const JSON_Array *array, size_t index);
获取数组中嵌套的数组

参数:array:数组对象;index:值对应的下标

返回值:失败:-1

json_array_get_number

double        json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */
获取数组中的值

参数:array:数组对象;index:值对应的下标

返回值:失败:-1

json_array_get_boolean

int           json_array_get_boolean(const JSON_Array *array, size_t index);
获取数组中的值

参数:array:数组对象;index:值对应的下标

返回值:失败:-1

json_array_get_count

size_t        json_array_get_count  (const JSON_Array *array);
获取数组的长度

参数:array:数组对象

返回值:失败:-1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值