简介

Jansson是一个用于解码、编码、操控JSON的C库。其特性为:

  1. 简单直观的API和数据模型
  2. 没有依赖项
  3. 完整的Unicode支持(UTF-8)
构建

Jansson使用cmake作为构建工具。可以执行下面的命令构建:

Shell
1
2
3
4
5

git clone https://github.com/akheron/jansson
cd jansson
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX:STRING=/home/alex/CPP/lib/jansson/2.9 -DJANSSON_BUILD_DOCS=OFF ..
cmake --build . -- install

上述命令执行后,Jansson的头文件和静态库被安装到/home/alex/CPP/lib/jansson/2.9目录

使用

这里我们创建一个CMake工程:

CMakeLists.txt
1
2
3
4
5
6
7

cmake_minimum_required(VERSION 3.6)
project(jansson_demo C)
set(SOURCE_FILES main.c)
include_directories(/home/alex/CPP/lib/jansson/2.9/include)
add_executable(jansson_demo ${SOURCE_FILES})
set_property(TARGET jansson_demo PROPERTY C_STANDARD 99)
target_link_libraries(jansson_demo /home/alex/CPP/lib/jansson/2.9/lib/libjansson.a)

解码JSON

下面的代码展示了如何把字符串解码为json_t结构:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#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;
}

运行上述代码后输出:

Shell
1
2
3

NAME: 汪震, AGE: 30
CHILDREN: 彩彩
CHILDREN: 当当

编码JSON

下面的代码展示了如何把json_t结构编码为字符串:

C
1
2
3

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 );

运行上述代码后输出:

Shell
1
2
3
4
5
6
7
8

{
    "age": 30,
    "children": [
        "彩彩",
        "当当"
    ],
    "name": "汪震"
}

打包JSON

下面的代码展示了如何把零散数据打包(pack)为json_t结构:

C
1
2
3
4
5
6
7
8
9
10
11
12
13

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;

可用的格式限定符如下表:

限定符 说明
s 将null结尾的UTF-8字符串转换为JSON字符串
s? 和上面类似,但是如果位置参数是NULL则插入JSON null值
s# 对应两个位置参数const char *, int,将指定长度的UTF-8缓冲转换为JSON字符串
s% 和上面类似,只是未知参数类型为const char *, size_t
+ 把此位置参数连接到前一个位置参数后面
+# 和上面类似,接收位置参数const char *, int
+% 和上面类似,接收位置参数const char *, size_t
n 输出null,不消耗位置参数 
转换int为JSON布尔值
转换int为JSON整数
转换json_int_t为JSON整数
f 转换double为JSON实数 
o 原样插入json_t*结构
和上面类似,但是目标json_t的引用计数会增加
 o?     o? 类似上面两个,但是当位置参数为NULL时插入null
[fmt] 使用内部的格式限定符构建一个JSON数组,fmt可以是任意符合要求的格式限定符序列
{fmt}  使用内部的格式限定符构建一个JSON对象,fmt可以是任意符合要求的格式限定符序列
解包JSON

下面的代码展示了如何把json_t结构解包为零散数据:

C
1
2
3
4
5
6

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 );

转载于:https://www.cnblogs.com/lifan3a/articles/10950741.html

使用Jansson处理JSON相关推荐

  1. JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用

    json | json-c使用入门 这篇讲的也不错,抽空看下(网络传输json数据) https://www.bilibili.com/video/av669454528?p=3&spm_id ...

  2. 实时数据交换平台 - BottledWater-pg with confluent

    标签 PostgreSQL , Bottled Water , Kafka , Confluent , IoT 背景 想必大家都在图书馆借过书,小时候有好看的书也会在小伙伴之间传阅. 借书和数据泵有点 ...

  3. linux c 解析生成json(jansson安装和使用)

    Jansson是用于编码,解码和生成JSON数据的C语言库.它的特性: 简单直观的API和数据模型 全面的文档 不依赖其他库 全面支持Unicode(UTF-8) 大量测试套件 0.下载jansson ...

  4. c语言json库如何编译,C语言的JSON库Jansson

    Jansson概述 Jansson是一个C语言库,用于编码,解码和处理JSON数据.其主要特点和设计原则是: 简单直观的API和数据模型 全面的文档 不依赖其他库 完全支持Unicode(UTF-8) ...

  5. STM32 基础系列教程 49 – Jansson

    前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...

  6. 【转】ABAP内表数据和JSON格式互转

    本程序演示ABAP内表数据如何转为JSON格式, 以及JSON数据如何放入内表. REPORT ZTEST005. DATA : JSON_SER TYPE REF TO CL_TREX_JSON_S ...

  7. window下jansson安装和使用

    Jansson是一个用于编码,解码和操作JSON数据的C库.它的特点是: 简单直观的API和数据模型 综合文件 不依赖于其他库 完整的Unicode支持(UTF-8) 广泛的测试套件 官网: http ...

  8. STM32上使用JSON

    一.STM32工程中添加JSON 最近在一网2串项目,串口和网口之间可能需要定义一下简单的通信协议,而通信协议上则需要去定义一下通信的数据格式,上次听剑锋说要用Json来定义,目前查了下资料具体如何去 ...

  9. webdis实现Redis的http接口及多数据格式共享 [含json,restful]

    前言: 最近用tornado写了redis的接口,为自己的做cs之间的数据中转,以及后期给别部门的临时数据调用.这些东西难度真不大,但是很杂乱,还要保证性能. 朋友推荐了我这款redis的http的服 ...

最新文章

  1. war包解压不了_牛骨高汤的熬制方法,拿走不谢!有了这配方,还愁开不了小吃店?...
  2. Hibernate中Inverse和Cascade
  3. springboot 问题Change project compliance and JRE to 1.5
  4. SAP S/4HANA里的生产订单,标识其已经结束生产可以发货的字段
  5. 微服务深入浅出(7)-- 网关路由Zuul
  6. python在web可以开发吗_Python Web开发
  7. 4245: KI的斐波那契 递归
  8. android输入自动补全,Android用户输入自动提示控件AutoCompleteTextView使用方法
  9. 基于51单片机的计算器
  10. Eviews 9.0新版本新功能——预测(Auto-ARIMA预测、VAR预测)
  11. mysql批量删除指定前缀的表,批量修改表名的SQL语句
  12. android rom定制 电视盒子,开发电视盒子的极简Android TV桌面
  13. 酷开系统AI智能让生活更简单化
  14. IntelliJ IDEA 2016.2 注册破解激活教程
  15. mac 安装commitizen插件报错Parsing JSON at /Users/lin/.czrc for commitizen config failed
  16. ZooKeeper报错:Unable to access datadir, exiting abnormally windows版本
  17. 陶陶摘苹果(python)
  18. Quartz配置资源介绍
  19. Go语言无孔不入的2016:跻身主流编程语言、国内大热、极速提升、尖端应用……
  20. SpringCache源码学习笔记

热门文章

  1. 学会在Linux环境下用c语言多文件制作lrc歌词解析器
  2. php技能栈,[PHP]程序员技能栈,php程序员技能_PHP教程
  3. 认识filebeat
  4. opencv在电脑屏幕上画_opencv平滑处理?opencv 画实心圆?OpenCV繪圖的實作-cvCircle,cvEllipse,cvElli...
  5. Python所有的内置函数 , 都帮你整理好了!
  6. C#实战积累:常用的lambda表达式整理
  7. 外贸员必不可少的24个实用工具,好用到飞起!!!
  8. 更改浮点型数据显示小数位数的方法
  9. 通过动图学习 CSS Flex
  10. 云上数据库:从零到壹的实践经验分享