首页 > 编程语言 >【c&c++】[C++]使用Jansson生成与解析json字符串

【c&c++】[C++]使用Jansson生成与解析json字符串

时间:2022-11-03 09:55:05浏览次数:47  
标签:std string jansson C++ Jansson json array root

安装配置序列化与反序列化生成Json解析Json

Jansson是一个用于解码、编码、操控JSON的C库:

  • 简单直观的API和数据模型

  • 没有依赖项

  • 完整的Unicode支持(UTF-8)

安装

 

要使用Jansson,则需要先安装:

 

  • 下载jansson(http://www.digip.org/jansson/releases)

  • 解压(tar -xvf jansson-XXX.tar.bz2)

  • 下载后即可安装了

    ./configure --prefix=/opt/jansson
    make
    sudo make install

    配置

    为使新安装的库生效,需要在(/etc/ld.so.conf.d)下添加jansson.conf
    配置文件:

/opt/jansson

然后执行sudo ldconfig,重新加载配置以生效。

序列化与反序列化

Jasson使用json_t表示json类型:

  • 加载并生成json类:json_load从字符串中加载,json_load_file从文件中加载;

  • 输出json字符串:json_dump输出字符串(返回的指针在不用时要及时释放掉),json_dump_file输出到文件中;

以解析如下格式的json为例进行说明:

//struct {
//    string name;
//    int age;
//    string class[];
//};

生成Json

通过json_object或json_array构造json_t,并在不用时通过json_delete来释放:

std::string buildJson(const std::string &strName, int nAge, std::vector<std::string> vClass){
    json_t *root = json_object();

    json_object_set_new(root, "name", json_string(strName.c_str()));
    json_object_set_new(root, "age", json_integer(nAge));

    auto *array = json_array();
    for(auto cls : vClass){
        json_array_append(array, json_string(cls.c_str()));
    }
    json_object_set_new(root, "class", array);

    auto *json = json_dumps(root, JSON_INDENT(0));
    std::string strJson = json;
    free(json);

    json_delete(root);
    json_delete(array);
    return strJson;
}

解析Json

通过json_loads加载后进行分析,在用完时通过json_decref解除引用。

bool parseJson(const std::string &strJson){
    json_error_t error;
    // root = json_load_file(file, 0, &error)
    json_t *root = json_loads(strJson.c_str(), 0, &error);
    if(!root){
        std::cout<<"load json fail: "<<error.text<<std::endl;
        return false;
    }

    std::cout<<"################Json###############"<<std::endl;
    auto item = json_object_get(root, "name");
    if(json_is_string(item)){
        std::cout<<"name: "<<json_string_value(item)<<std::endl;
    }
    item = json_object_get(root, "age");
    if(json_is_integer(item)){
        std::cout<<"age: "<<json_integer_value(item)<<std::endl;
    }

    auto array = json_object_get(root, "class");
    if(json_is_array(array)){
        std::cout<<"class: ";
        for(int i=0; i<json_array_size(array); ++i){
            auto cls = json_array_get(array, i);
            std::cout<<json_string_value(cls)<<", ";
        }
        std::cout<<std::endl;
    }

    json_decref(root);
    return true;
}

 

标签:std,string,jansson,C++,Jansson,json,array,root
From: https://www.cnblogs.com/opensmarty/p/16853433.html

相关文章

  • C++语法
    C++常量和变量变量的定义方式:const类型名字{};直接使用值#define名字值常量定义方式:类型名字{};类型名字=初始值;不管是常量还是变量,本质都是在内存中申......
  • 第十三届蓝桥杯省赛C++B组
    《X进制减法》题目连接:https://www.acwing.com/problem/content/4407/贪心,数学推导  我们先来看一下这个65是如何算出来的:321:第一位为二进制,则逢2进1,ans+=1;......
  • tensorflow1.x——如何在C++多线程中调用同一个session会话
    相关内容:tensorflow1.x——如何在python多线程中调用同一个session会话 =================================================......
  • C++ 常量引用,用来修饰形参,防止误操作
    voidfunc(constint&b){b=1000;//cout<<b<<endl;}intmain(){inta=10;//constint&b=10;//10是一个常量inta=10实际是c......
  • C++ 引用的本质就是一个指针常量
    //int*constb=&a;voidfunc(int&b){//*b=100b=100;}intmain(){inta=10;//int*constb=a;指针常量是指针方向......
  • C++ 引用作为返回值
    //不要反悔局部变量的引用int&test0(){inta=10;returna;}//函数的调用可以作为左值int&test1(){staticinta=10;//静态......
  • c++ 引用作为参数传递
    //值传递voidswap(inta,intb){inttmp=a;a=b;b=tmp;cout<<"swapa"<<a<<endl;cout<<"swap......
  • c++ 引用注意事项
    intmain(){/**引用注意事项1.引用必须初始化2.引用初始化后就不能更改*/inta=10;intc=100;//int&b......
  • C++ 引用为变量起别名
    引用的基本使用 intmain(){//给变量起别名//语法数据类型&别名=变量名inta=10;int&b=a;cout<<"a......
  • 类的作用域详解(C++ primer7.4笔记)
    7.4类的作用域名字查找的过程:(查找匹配的声明)在名字所在块中寻找语句,查找使用名字之前出现的声明。如果没找到,查找外层作用域还没找到就报错类的定义分为两步处理:......