暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第二十七天:Jsoncpp的配置与使用

瓶子的跋涉 2023-03-16
1112

JSONcpp

开发环境配置

现成版百度网盘

jsoncpp现成配置环境VS2022开发环境x64[1]

链接:https://pan.baidu.com/s/1-DjqbRVVSmDizcD8wbEGFg?pwd=5213 提取码:5213

环境配置版

下载Jsoncpp

git clone https://github.com/open-source-parsers/jsoncpp

cmake进行编译

下载cmake

cmake下载链接[2]^1

解析出动态

  • 安装cmake
    默认安装即可
  • jsoncpp所在文件夹,以及生成
    jsoncpp.dll和jsoncpp.lib`等动态文件的文件夹
  • 第一个为VS的版本,第二个默认x64
    不用填

  • 配置不动,点击生成
    即可,会发现生成文件逐步完成

  • 打开
    生成文件的项目

  • jsoncpp_dll
    设置为启动项
    ,并右键点击第一个生成
    即可完成静态文件的生成

  • 可以在C盘新建
    一个存放环境的位置cpp
  • 将下载clone
    的jsoncpp文件下的include文件全部放入C盘文件夹cpp中(此文件为jsoncpp的头文件)
  • 将生成文件之后项目文件夹中bin\Debug
    下的jsoncpp.dll
    复制到C盘文件夹cpp下与include同级
    lib
    文件夹(自己创建)下
  • 将生成文件之后项目文件加中lib\Debug下的jsoncpp.lib
    复制到C盘cpp文件夹lib
    文件下下

VS2022环境配置

  • 右键点击项目进入属性配置
VS配置jsoncpp

最后配置

运行下面的实例代码很可能出现“运行程序无法启动的问题”,将(刚才C盘中)jsoncpp.dll
文件复制到main.cpp
对应的资源文件夹下即可

实例代码

#include <json/json.h>
#include <fstream>
#include <iostream>
using namespace std;
using namespace Json;

//对于Json数组而言,内部的顺序是有序的,这个顺序就是添加数据的顺序
void writeJson()
{
//定义Value对象
Value root;
//使用append方法向Value包装器li填充数据
root.append("luffy");
root.append(19);
root.append(170);
root.append(false);

//又定义一个subArray的Value对象
Value subArray;
subArray.append("ace");
subArray.append("sabo");
//将subArray对象增加到root里面
root.append(subArray);

Value obj;
//定义键值对
obj["sex"] = "man";
obj["girlfriend"] = "Hancock";
//将obj对象的键值对增加到root里面
root.append(obj);
#if 1
//对上面数据格式序列化使用toStyledString方法得到带格式的字符串
string json = root.toStyledString();
#else
//得到不带格式的字符串
FastWriter w;
//通过write方法得到不带换行符的字符串
string json = w.write(root);
#endif
//写文件
//write -> ostream
//read -> ifstream
//将json数据写入test.json
ofstream ofs("test.json");
//写入格式化后带格式的字符串
ofs << json;
//关闭文件
ofs.close();
}
/*保存到的json数据
[
"luffy",
19,
170,
false,
[
"ace",
"sabo"
],
{
"girlfriend" : "Hancock",
"sex" : "man"
}
]
*/


void readJson()
{
//读,打开test.json
ifstream ifs("test.json");
Reader rd;
Value root;
//将json数据解析到root里面
rd.parse(ifs, root);
//判断解析的root value类是否是Array
if (root.isArray())
{
//size方法判断
for (unsigned i = 0; i < root.size(); ++i)
{
Value item = root[i];
//对类型进行判断,并对对应的类型进行输出
if (item.isInt())
{
cout << item.asInt() << " ,";
}
else if (item.isString())
{
cout << item.asString() << " ,";
}
else if (item.isBool())
{
cout << item.asBool() << " ,";
}
else if (item.isArray())
{
for (unsigned j = 0; j < item.size(); ++j)
{
cout << item[j].asString() << ", ";
}
}
else if (item.isObject())
{
//Return a list of the member names.
Value::Members keys = item.getMemberNames();
for (int k = 0; k < keys.size(); ++k)
{
cout << keys.at(k) << "," << item[keys[k]];
}
}
cout << endl;
}
}
}

int main()
{
writeJson();
printf("json写入完毕");
readJson();


return 0;
}

具体用法

声明命名空间

using  namespace Json;

jsoncpp的三个类

Value类

Value类
:封装Json
支持的所有类型,方便后序处理数据

Value检测类型

使用Value.isNull()
判断是够为空,输出bool值

  bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isInt64() const;
bool isUInt() const;
bool isUInt64() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;

Value
转换为对应类型
  Int asInt() const;
UInt asUInt() const;
#if defined(JSON_HAS_INT64)
Int64 asInt64() const;
UInt64 asUInt64() const;
#endif // if defined(JSON_HAS_INT64)
LargestInt asLargestInt() const;
LargestUInt asLargestUInt() const;
float asFloat() const;
double asDouble() const;
bool asBool() const;

FastWriter类

Value
对象中的数据序列化为字符串

std::string Json::FastWriter::write(const Value& root);

  • 将数据格式化,不带换行符,编程单行

Reader类

反序列化,将json字符串
解析为Value类型

parse
方法
bool Json::Reader::parse(const std::string& decument,Value& root,bool collectComments=true);

参数:

  • document:json
    格式字符串,打开
    的json文件
  • root:传出参数,存储
    了json字符串解析
    出的数据
  • collectComments:是否保存注释信息
    ,默认True
 bool parse(const char* beginDoc, const char* endDoc, Value& root,bool collectComments = true);

参数:

  • bneginDoc和endDoc指针定位
    json字符串,解析部分
    json字符串
  //brief Parse from input stream.
//see Json::operator>>(std::istream&, Json::Value&).
bool parse(IStream& is, Value& root, bool collectComments = true);

参考资料

[1]

jsoncpp现成配置环境VS2022开发环境x64: 链接:https://pan.baidu.com/s/1-DjqbRVVSmDizcD8wbEGFg?pwd=5213

[2]

链接: https://cmake.org/download/


文章转载自瓶子的跋涉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论