把结构化数据表示为JavaScript对象的标准格式即JavaScript Object Notation(JSON),通常用于网络传输数据,其格式举例如下。
{
"a": 1,
"b": "string",
"c": [1, 2, 3],
"d": {
"d1": 1,
"d2": "d2string"
}
}
使用前
JsonCpp库可以从SourceForge下载,将下载的压缩包解压,将“jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json”文件夹和“jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json”文件夹目录下的文件都拷贝到工程,比如在VS工程目录下新建一个Json文件夹将上述文件夹都拷贝进去。
有的教程说要对json_reader.cpp、json_value.cpp和json_writer.cpp,在右键“属性→配置属性→C/C++→预编译头→不使用预编译头”,否则可能出现编译错误,而我的VS2019社区版默认了工程是不使用预编译头。
在用到的cpp里加入:
#include "Json/json/json.h" //“Json/json”对应实际放置的路径
再右键项目选择“属性→配置属性→VC++目录→常规→外部包含目录”添加“.\Json”,即可开始使用。如果还是报错无法解析的外部符号,点击VS工程右上角的“显示所有文件”按钮,选择Json文件夹右键点击“包含在项目中”。
使用
Json::Value
Json定义的一种值,值的类型有:
enum ValueType
{
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};
Json::Value如果是intValue等数据类型,常常要转换成其他值,在转换前先用isXXX()判断是否是期望的值,然后用asXXX()转换,比如:
//Json::Value val;
if (val.isString()) //值是否为字符串类型
{
std::string str = val.asString();
}
Json::Reader
Json解释器,将Json格式的字符串解析到Json::Value对象。
string str = "xxx"; // 必须是写成Json格式的字符串,否则解析失败
Json::Value value;
Json::Reader reader;
if (reader.parse(str, value))//解析成功返回true
{
// 解析成功要对value做什么
}
Json::FastWriter和Json::StyleWriter
将Json::Value对象转换为Json格式字符串,前者是无格式的字符串,后者是格式化的字符串(比如格式化网站中对字段等进行换行、更方便查看)。
string str;
Json::Value value;
value["exp"] = "JsonCpp的使用方法";
Json::FastWriter fwriter;
str = fwriter.write(value);//str = "{"exp":"JsonCpp的使用方法"}\n"
Json::StyledWriter swriter;
str = swriter.write(value);//str = "{\n \"exp\" : \"JsonCpp的使用方法\"\n}\n";
str = value.toStyledString();//和上一句效果一样