C++ Json解析库Jsoncpp下载+编译+使用

C++ Json解析库Jsoncpp下载+编译+使用

一、 Json

1.定义

​ 什么是 JSON ?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言
  • JSON 具有自我描述性,更易理解
  • JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

w3c的标准说明如下:
 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使json成为理想的数据交换语言。
所以几乎所有的语言都会有支持json格式转化的库。

2.格式

json的格式只有两种,所以非常简单方便:
键值对
 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;“键值对”之间使用“,”分隔。
数组
 数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。

3.示例

{  
"employees": [  
{  
"firstName": "Bill",  
"lastName": "Gates"  
},  
{  
"firstName": "George",  
"lastName": "Bush"  
},  
{  
"firstName": "Thomas",  
"lastName": "Carter"  
}  
]  
}  

​ 要注意的是,每一个非数值的字符串都应当带引号,否则标准的解析库是无法解析的。
​ 网上也有很多json的在线格式化的网站,在遇到json无法解析的时候可以去那里找找错。

4.类型

最后需要注意的是,json里的数字都是双精浮点数,因此无法精确的表示 Long 型。在存储大 Long 型数据的时候要小心,不要丢失精度了。

二、Jsoncpp

1.介绍

​ JSON全称为JavaScript Object Notation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。Jsoncpp是c++解析JSON串常用的解析库之一。

2.下载

​ 目前代码维护在github。

​ 首先从github下载最新版zip:

https://github.com/open-source-parsers/jsoncpp/releases?spm=a2c4e.10696291.0.0.430919a44F1Wlf

​  接着,将其解压。

3.编译和使用

​ Win10 + VS2019 community。

步骤1:编译生成lib

​ 在VS 2019中打开E:\jsoncpp-0.10.7\makefiles\msvc2010下的jsoncpp.sln。右键->重新生成解决方案。此时,会在目录jsoncpp-0.10.7\makefiles\msvc2010\Debug下生成lib_json.lib文件。

步骤2:将所需文件添加至自己的工程

​ 将步骤1生成的lib_json.lib文件和目录jsoncpp-0.10.7下的include文件夹拷贝至自己的项目/工程目录下:

​ 这时在vs的目录列表里是看不到这个目录的,在如下图工具栏中点击图标【显示所有文件】,就可以看到新增的目录了:

​ 这时实际上还没有真正地加入到工程中来,相关图标是红色的,要在工程目录上右键选择【包括在项目中】即可。

步骤3:设置工程属性

​ 工程必须是win32;

​ 工程->属性->配置属性->c/c+±>代码生成->运行库,设置运行库为多线程调试 (/MTd);

步骤4:测试使用

​ 在JsonTest2中JsonTest2.cpp中添加测试代码(写json文件):

#include <fstream>  
#include "include/json/json.h"  
using namespace std;  
#pragma comment(lib, "json_vc71_libmtd.lib")  
int main()  
{  
    Json::Value root;  
    root["occupatio"] = "paladin";  
    root["camp"] = "alliance";  
    root["role_id"] = 1;  

    Json::StyledWriter writer;  
    ofstream os;  
    os.open("test.json");  
    os << writer.write(root);  
    os.close();  
    return 0;  
}  

​ 编译运行后,工程目录下生成test.json文件。

三、C++ Jsoncpp解析Json对象

1.json格式:键-值的一重嵌套

{  

“id” : 123,  

"name" : "wu"  

}  

​ 我们直接将上面的数据初始化到到string对象中,方便解析,后面都是如此。

std::string json = "{\"id\" : 123, \"name\" : \"wu\"}";  

Json::Reader reader;    
Json::Value root;    
std::string name;  
int id = 0;  
if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素     
{    
    name = root["name"].asString();  
    id = root["id"].asInt();  
}  

2.json格式:数组

[ { "id" : 1, "name" : "wu"},  {"id":2, "name" : "tan"} ]  

​ 解析方法如下:

std::string json = "[ {\"id\" : 1, \"name\" : \"wu\"}, {\"id\" : 2, \"name\" : \"tan\"} ]";  

Json::Reader reader;    
Json::Value root;    
std::string name;  
int id = 0;  
std::map<int, std::string> mapJson;  

if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素     
{    
    for (int i = 0; i < root.size(); ++i)  
    {  
        name = root[i]["name"].asString();  
        id = root[i]["id"].asInt();  

        mapJson[id] = name;  
    }  
}  

3.json格式:数组2

​ 如果是这样的数组:

{  

“id” : [1, 2],  

"name" : ["wu", "tan"]  

}  

​ 解析方法如下:

std::string json = "{\"id\" : [1, 2], \"name\" : [\"wu\", \"tan\"] } ";  

Json::Reader reader;    
Json::Value root;    
std::string name;  
int id = 0;  

if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素     
{    
    for (int i = 0; i < root["id"].size(); ++i)  
    {  
        id = root["id"][i].asInt();  
    }  

    for (int i = 0; i < root["name"].size(); ++i)  
    {  
        name = root["name"][i].asString();  
    }  
}  

​ 这种情况其实和上一种是类似的。

4.json格式:多重嵌套

为了简便,我们嵌套两层。

{  

"id" : 1,  

"data" : {  

"name" : "wu",  

“age” : 26  

}  

}  

​ 其实这种情况和第一种的类似,只是通过root[“key”]取到的还是键值对,继续通过key取值即可。

​ 基本上再复杂的数据格式也是上面几种情况的组合而已。

​ 解析方法如下:

std::string json = "{\"id\" : 1, \"data\" : { \"name\" : \"wu\",  \"age\" : 26 } }";  

Json::Reader reader;    
Json::Value root;    
std::string name;  
int id = 0;  
int age = 0;  

if (reader.parse(json, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素     
{    
    id = root["id"].asInt();  
    name = root["data"]["name"].asString();  
    age = root["data"]["age"].asInt();  
}  

四、C++ Jsoncpp生成Json对象

1.json格式:键-值的一重嵌套

{  

“id” : 123,  

"name" : "wu"  

}  

​ 生成方法如下:

Json::Value root;    

root["id"] = 123;  
root["name"] = "wu";  

std::string json = root.toStyledString();

​ 我们会将生成的json对象序列化到string对象中去,后面也是如此。

2.json格式:数组

[ { "id" : 1, "name" : "wu"},  {"id":2, "name" : "tan"} ]  

​ 生成方法如下:

Json::Value root;  

for (int i = 0; i < 2; ++i)  
{  
    root[i]["id"] = i + 1;  

    if (0 == i)  
    {  
        root[i]["name"] = "wu";  
    }  
    else  
    {  
        root[i]["name"] = "tan";  
    }  
}  

std::string json = root.toStyledString();  

​ 还可以这样生成:

Json::Value root;  
Json::Value item;  

for (int i = 0; i < 2; ++i)  
{  
    item["id"] = i + 1;  

    if (0 == i)  
    {  
        item["name"] = "wu";  
    }  
    else  
 {  
        item["name"] = "tan";  
    }  

    root.append(item);  
}  

std::string json = root.toStyledString();  

3.json格式:数组2

1.	{  
2.	  
3.	“id” : [1, 2],  
4.	  
5.	"name" : ["wu", "tan"]  
6.	  
7.	}  

​ 生成方法如下:

Json::Value root;  

for (int i = 0; i < 2; ++i)  
{  
    root["id"].append(i);  

    if (0 == i)  
    {  
        root["name"].append("wu");  
    }  
    else  
    {  
        root["name"].append("tan");  
    }  

}  

std::string json = root.toStyledString(); 

4.json格式:多重嵌套

​ 为了简便,我们嵌套两层。

{  

"id" : 1,  

"data" : {  

"name" : "wu",  

“age” : 26  

}  
}

​ 生成方法如下:

Json::Value root;  

root["id"] = 1;  
root["data"]["name"] = "wu";  
root["data"]["age"] = 26;  

std::string json = root.toStyledString();  

​ 其实解析和生成json是互逆的,只要明白这几种情况,其他的无非是这几种情况的各种组合,原理是一样的。

五、Chromium 中使用Jsoncpp

1.添加头文件

​ Jsoncpp为Chromium自带的第三方库,位于目录:src/third_party/jsoncpp。

​ 使用时,需在当前模块的头文件中添加头文件:

#include "third_party/jsoncpp/source/include/json/json.h"

2.在BUILD.gn中添加deps

​ 使用时,需在当前模块的BUILD.gn文件中添加deps:

deps += [
    "//third_party/jsoncpp",
  ]

3.编译

​ 需重新编译当前模块,假设当前模块为content:

ninja content
  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: C++和MFC结合使用JsonCpp可以很方便地处理JSON数据。JsonCpp是开源的C++,提供了用于读取、写入和操作JSON数据的方法和类。 首先,使用JsonCpp,我们需要将JsonCpp头文件和源文件包含到项目中,并链接相应的文件。 然后,我们可以使用JsonCpp提供的方法来解析和生成JSON数据。例如,如果我们有一个JSON字符串,我们可以使用Json::Reader类来解析它: ``` Json::Value root; Json::Reader reader; std::string jsonString = "{\"name\":\"John\",\"age\":30}"; // 假设我们有一个JSON字符串 bool parsingSuccess = reader.parse(jsonString, root); if (parsingSuccess) { std::string name = root["name"].asString(); // 获取"name"字段的值 int age = root["age"].asInt(); // 获取"age"字段的值 // 进一步处理... } ``` 同样,如果我们想生成一个JSON字符串,我们可以使用Json::Value类来构建JSON对象: ``` Json::Value root; root["name"] = "John"; root["age"] = 30; // 进一步添加其他字段... Json::FastWriter writer; std::string jsonString = writer.write(root); // 输出结果:{"name":"John","age":30} ``` 除了读取和生成JSON数据之外,JsonCpp还提供了其他一些功能,如检查JSON数据是否有效、遍历JSON对象等。 总之,C++和MFC结合使用JsonCpp可以方便地处理JSON数据。我们可以使用JsonCpp提供的方法来解析和生成JSON数据,从而实现对JSON数据的读取和操作。 ### 回答2: 在C++/MFC中使用JSONcpp可以方便地进行JSON数据的解析和生成。JSONcpp是一个开源的C++,提供了一套API供开发人员操作JSON数据。 首先,在使用JSONcpp之前,需要将其文件添加到项目中。可以从JSONcpp的官方网站或其他途径下载JSONcpp的源代码,并将其编译为静态或动态文件。 接下来,可以通过以下步骤在C++/MFC中使用JSONcpp: 1. 引入JSONcpp头文件: ```cpp #include <json/json.h> ``` 2. 创建一个Json::Value对象,用于存储解析后的JSON数据或将数据转换为JSON格式: ```cpp Json::Value jsonValue; ``` 3. 解析JSON数据: ```cpp Json::CharReaderBuilder jsonBuilder; std::string jsonStr = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; std::istringstream jsonStream(jsonStr); std::string jsonErrs; if (Json::parseFromStream(jsonBuilder, jsonStream, &jsonValue, &jsonErrs)) { // 解析成功,可以通过jsonValue对象访问解析后的数据 } else { // 解析失败,处理错误 } ``` 4. 访问解析后的JSON数据: ```cpp std::string name = jsonValue["name"].asString(); int age = jsonValue["age"].asInt(); std::string city = jsonValue["city"].asString(); ``` 5. 生成JSON数据: ```cpp jsonValue["name"] = "John"; jsonValue["age"] = 30; jsonValue["city"] = "New York"; std::ostringstream jsonStream; Json::StreamWriterBuilder jsonWriter; std::unique_ptr<Json::StreamWriter> writer(jsonWriter.newStreamWriter()); writer->write(jsonValue, &jsonStream); std::string jsonStr = jsonStream.str(); ``` 通过以上步骤,可以在C++/MFC中很方便地使用JSONcpp进行JSON数据的解析和生成。在实际应用中,可以根据需要,结合其他功能,灵活地处理JSON数据。 ### 回答3: 在使用MFC开发项目时,我们可以通过Jsoncpp来处理JSON数据。Jsoncpp是一个开源的C++,提供了一套简单易用的API来读取、解析、生成和操作JSON数据。 首先,我们需要将Jsoncpp添加到MFC项目中。可以从官方网站上下载到源代码,然后将其编译成静态链接或动态链接,再将其导入到MFC项目中。 接下来,我们可以使用Jsoncpp提供的API来解析JSON数据。可以使用Json::Value对象来表示JSON数据,并通过Json::Reader来读取JSON数据并解析Json::Value对象。例如,可以使用以下代码来解析一个包含JSON数据的字符串: ```cpp #include <json/json.h> #include <iostream> int main() { std::string jsonData = "{\"name\":\"John\",\"age\":30}"; Json::Value root; Json::Reader reader; bool success = reader.parse(jsonData, root); if (success) { std::string name = root["name"].asString(); int age = root["age"].asInt(); std::cout << "Name: " << name << std::endl; std::cout << "Age: " << age << std::endl; } else { std::cout << "Failed to parse JSON!" << std::endl; } return 0; } ``` 上述代码将会输出以下结果: ``` Name: John Age: 30 ``` 除了解析JSON数据,我们还可以使用Jsoncpp生成JSON数据。可以使用Json::Value对象来表示生成的JSON数据,并通过Json::FastWriter或Json::StyledWriter来将Json::Value对象转换为字符串。例如,可以使用以下代码来生成一个包含JSON数据的字符串: ```cpp #include <json/json.h> #include <iostream> int main() { Json::Value root; root["name"] = "John"; root["age"] = 30; Json::FastWriter writer; std::string jsonData = writer.write(root); std::cout << "JSON Data: " << jsonData << std::endl; return 0; } ``` 上述代码将会输出以下结果: ``` JSON Data: {"name":"John","age":30} ``` 除了解析和生成JSON数据,Jsoncpp还提供了其他一些API来操作JSON数据,例如增加、修改、删除和查找JSON对象和数组中的元素。 总之,使用Jsoncpp可以很方便地在MFC项目中处理JSON数据。无论是解析JSON数据还是生成JSON数据,Jsoncpp都提供了简单易用的API来满足我们的需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值