jansson库使用
简介:
Jansson是一个用于解码、编码、操控JSON的C库。其特性为:
简单直观的API和数据模型
没有依赖项
完整的Unicode支持(UTF-8)
需要的头文件: #include <jansson.h>
格式限定符:
应用举例:
解码JSON
下面的代码展示了如何把字符串解码为json_t结构:
C
#include <jansson.h>
#include <assert.h>int main() {char *text = "{ \"name\":\"汪震\", \"age\":30, \"children\":[ \"彩彩\", \"当当\" ] }";json_error_t error;// json_t用于引用任何JSON节点json_t *root = json_loads( text, 0, &error );// 如果读取失败,自动置为空指针if ( !root ) {fprintf( stderr, "error: on line %d: %s\n", error.line, error.text );return 1;} else {// json_is_*宏用于判断数据类型// 处理JSON对象assert( json_is_object( root ));json_t *name, *age, *children;name = json_object_get( root, "name" );age = json_object_get( root, "age" );fprintf( stdout, "NAME: %s, AGE: %d\n", json_string_value( name ), json_integer_value( age ));children = json_object_get( root, "children" );// 处理JSON数组assert( json_is_array( children ));int sof = json_array_size( children );for ( int i = 0; i != sof; i++ ) {json_t *child = json_array_get( children, i );fprintf( stdout, "CHILDREN: %s\n", json_string_value( child ));}// 减小引用计数,导致资源回收json_decref( root );}return 0;
}
运行上述代码后输出:
NAME: 汪震, AGE: 30
CHILDREN: 彩彩
CHILDREN: 当当
编码JSON
下面的代码展示了如何把json_t结构编码为字符串:
C
json_t *root = json_pack( "{sssis[ss]}", "name", "汪震", "age", 30, "children", "彩彩", "当当" );
char *text = json_dumps( root, JSON_INDENT( 4 ) | JSON_SORT_KEYS );
fprintf( stdout, "%s\n", text );
运行上述代码后输出:
{"age": 30,"children": ["彩彩","当当"],"name": "汪震"
}
打包JSON
下面的代码展示了如何把零散数据打包(pack)为json_t结构:
assert( json_is_integer( json_pack( "i", 1 )));
assert( json_is_array(// jansson使用格式限定符来指定要创建的JSON的JSON节点的类型// 下面的例子创建三元素的数组:字符串、字符串、布尔值json_pack( "[ssb]", "foo", "bar", 1 )
));
/* 打包一个空对象 */
json_pack( "{}" );
/* 打包出 {age:30,childNum:2} */
json_pack( "{sisi}", "age", 30, "childNum", 2 );
/* 打包出 [[1, 2], {"num": true}] */
json_pack( "[[i,i],{s:b}]", 1, 2, "num", 1 );
return 0;
解包JSON
下面的代码展示了如何把json_t结构解包为零散数据:
json_t *root = json_pack( "{sssis[ss]}", "name", "汪震", "age", 30, "children", "彩彩", "当当" );
char *name;
int age;
// 可以仅仅解包一部分
json_unpack( root, "{sssi}", "name", &name, "age", &age );
fprintf( stdout, "NAME: %s, AGE:%d\n", name, age );
Refer:
Jansson API 介绍
jansson库使用相关推荐
- jansson库double精度控制
jansson库可使用JSON_REAL_PRECISION()控制精度: //精度控制,保持6位数据(包含小数) char *pJson = json_dumps( root ,JSON_REAL_ ...
- STM32 基础系列教程 49 – Jansson
前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...
- avro的c语言api,在CentOS/RHEL上编译序列化软件Avro的C语言接口库
消息由键,值和头部组成.Kafka不识别消息中键和值,它按字节数组处理他们.但生产者和消费者关心如何读取这些数据.所以我们希望数据存储的方式是易读的,同时它还要尽可能地紧凑和快速编解码.例如,JSON ...
- STM32 基础系列教程 50 – MbedTls
前言 mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码.这是双重许可与Apache许可证 2.0版(与GPLv2许可也可).网站上指出,mbed ...
- 用python做一个上位机串口通信_【教程】简易Python上位机之LED控制
电子爱好者应该不会对"上位机"这个词感到陌生,毕竟或多或少有过接触.但若是说到上位机的开发的话,大家就不一定熟悉了.很多电子爱好者完全没有接触过上位机的开发工作,他们真的没有相应的 ...
- OneNET Studio云平台STM32物联网开发(2)- STM32+Air724UG(4G模组)数据采集显示上报
实现效果视频 STM32 Air724UG 4G OneNET数据传输 本章教学视频(1) OneNET StudioSTM32+Air724UG -1 本章教学视频(2) OneNET Studio ...
- python led屏控制_【教程】简易Python上位机之LED控制
电子爱好者应该不会对"上位机"这个词感到陌生,毕竟或多或少有过接触.但若是说到上位机的开发的话,大家就不一定熟悉了.很多电子爱好者完全没有接触过上位机的开发工作,他们真的没有相应的 ...
- 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程[设备接入-ESP端侧数据收集[MQTT]-实时数据分析](步步截图较详细) 在这篇你将会接触到:从物联网工程师从硬件层-通信层到应用层全流程:开发华为云最基本 ...
- uwsgi配置文件详解
目录 官方文档 安装 配置风格 命令行参数(command line args) 环境变量(environment variable) xml文件 ini文件 yaml文件 配置参数 socket p ...
最新文章
- Comet:基于 HTTP 长连接的“服务器推”技术解析
- redis布隆过滤器PHP,Redis 中的布隆过滤器
- Java描述设计模式(24):备忘录模式
- presentViewController:navigationController animated:YES completion:^(void)
- 链表的基本操作(单链表)
- 水仙花数c语言程序vb,VB编程:求水仙花数
- Android 实现基于RTMP视频播放
- 科比职业生涯数据集分析
- 由简入难学习3d机械制图软件顺序?Pro/Engineer 与CREO有何不同。
- 小鹿线前端课程怎么样
- 微信小程序图集短视频去水印源码教程
- 【windows环境 PKCS11库Demo 用于劫持PKCS11库并打印参数】
- 链式前向星dij堆优化
- 如何实现一个地图库封装,可以快速切换地图
- Python 图像 一样大小_#带你学Python# 表白利器:用Python发微信表情画-带你认识图片的秘密...
- 积分与微分电路 (转)
- access实验报告体会_Access实验报告
- 字节跳动疯狂扩张:IPO前的最后一战
- 马航空难2大可能结果
- 【AI达人创造营第二期】基于PaddleClas的新冠肺炎CT影像的分类