• jansson库使用


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

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

    需要的头文件: #include

    格式限定符
    在这里插入图片描述

    应用举例

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

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

    运行上述代码后输出:

    NAME: 汪震, AGE: 30
    CHILDREN: 彩彩
    CHILDREN: 当当
    
    • 1
    • 2
    • 3

    编码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 );
    
    • 1
    • 2
    • 3

    运行上述代码后输出:

    {
        "age": 30,
        "children": [
            "彩彩",
            "当当"
        ],
        "name": "汪震"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    打包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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    解包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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Refer:
    Jansson API 介绍

  • 相关阅读:
    记一次PDU接室外监控溶解事故
    通用栈实现
    c++ || mutable_explicit_volatile关键字
    从一道面试题开始学习C++标准库提供的并发编程工具
    Redis常用数据结构操作与底层原理
    小程序webView页面转发后,进入页面空白
    详解ClickHouse的ReplaceMergeTree
    Android LiveData 介绍
    《web课程设计》期末网页制作 基于HTML+CSS+JavaScript制作公司官网页面精美
    TSINGSEE青犀视频AI算法助力构建城市市容·街面秩序管理解决方案
  • 原文地址:https://blog.csdn.net/weixin_43330388/article/details/127650759