jsoncpp简介:
jsoncpp是一个 C++ 库,用于实现json格式的序列化和反序列化,完成多个数据对象组织成为json格式字符串,以及将json格式字符串解析成得到多个数据对象的数据。它还可以在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。
github地址:
官方网址:https://github.com/open-source-parsers/jsoncpp
编译:
修改 CMakeLists.txt,将 JSONCPP_WITH_TESTS 配置成 OFF,不去编译测试工程
jsoncpp编译:
cd jsoncpp/
mkdir install # 创建安装目录
mkdir build # 创建编译目录
cd build
cmake -DCMAKE_INSTALL_PREFIX=../install ..
make -j4 # 开始编译
make install # 安装到install
jsoncpp交叉编译:
创建一个 toolchain.cmake 文件:
# This is required. target system name
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
# specify the cross compiler
SET(TOOLCHAIN_PATH /opt/arm/opt/ext-toolchain/)
SET(CMAKE_SYSROOT ${TOOLCHAIN_PATH}/../../usr/arm-buildroot-linux-gnueabihf/sysroot)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf-g++)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
cd jsoncpp/
mkdir install
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake -DCMAKE_INSTALL_PREFIX=../install ..
make
make install
jsoncpp使用:
jsoncpp中含有三种基础类:Value、Write、Reader。
Json::Value:用于存储键值对
Json::Writer
这个类负责将内存中的value对象转换为json文档,输出到文件或者字符串中
它有两种主要的方法:FastWriter、StyledWriter
FastWriter:快速无格式的将value转换成json文档
StyledWriter:有格式的将value转换成json文档
Json::Reader
用于读取json文档,或者说是用于将字符串或者文件输入流转换为Json::Value对象
实用函数
判断某个键是否存在,bool Json::Value::isMember(const char *key) const;若存在则返回1,反之为0
判断某个键的类型,bool Json::Value::isString(const char *key) const;是则返回1,反之为0
得到Value中的所有键,Json::Value::getMemberBames() const;返回一个string类型的vector
删除某个键,Json::Value::removeMember(const char *key);返回删除的值或者null
测试demo
#include <iostream>
#include <fstream>
#include "json/json.h"
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning(disable : 4996)
#endif
using namespace std;
int createjson()
{
Json::Value root;
Json::Value language;
Json::Value mail;
Json::StyledWriter writer; # 格式化json串
// Json::FastWriter writer; # 压缩json串
root["Name"] = "pikashu";
root["Age"] = 18;
language[0] = "C++";
language[1] = "Python";
root["Language"] = language;
mail["QQ"] = "789123456@qq.com";
mail["Google"] = "789123456@gmail.com";
root["E-mail"] = mail;
string json_file = writer.write(root);
ofstream ofs;
ofs.open("test1.json");
if (!ofs.is_open())
{
cout << "open file error." << endl;
return -1;
}
ofs << json_file;
ofs.close();
return 0;
}
int readjson()
{
Json::Reader reader;
Json::Value root;
Json::Value language;
Json::Value mail;
ifstream ifs;
ifs.open("test1.json");
if (!ifs.is_open())
{
cout << "open file error." << endl;
return -1;
}
if (!reader.parse(ifs, root))
{
cout << "parse error" << endl;
return -1;
}
string Name = root["Name"].asString();
int Age = root["Age"].asInt(); // jsoncpp中获取int类型数据
cout << "Name: " << Name << endl;
cout << "Age: " << Age << endl;
if (root["language"].isArray())
{
Json::Value array_l = root["language"];
cout << "Language: ";
for (int i = 0; i < array_l.size(); i++)
{
cout << array_l[i] << " ";
}
cout << endl;
}
cout << "Google: " << root["E-mail"].get("Google", "").asString() << endl;
cout << "QQ: " << root["E-mail"].get("QQ", "").asString() << endl;
return 1;
}
int main()
{
createjson();
readjson();
return 0;
}
参考:
交叉编译jsoncpp_jsoncpp交叉编译_蒋禾的博客-CSDN博客
https://www.cnblogs.com/nazhen/p/16800412.html
————————————————
版权声明:本文为CSDN博主「我是谁??」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lu_linux/article/details/129851534