JSON文本:

//document.json
{"name":"xiaoming","gender":"boy","hobby":["足球","篮球","电影"],"socre":{"数学":91.5,"英语":96.0,"语文":95.5},"lover":{"name":"xiaohong","gender":"girl","hobby":["画画","跳舞","唱歌"],"score":{"数学":78.5,"英语":90.0,"语文":89.0}}}

由于复制的过程中,json文本可以出现错误,可以用将json文本复制到JSON在线编辑器验证一下。

解析代码:

#include<string>
#include<fstream>
#include<iostream>
#include"document.h"
using namespace std;
int main () {
  std::ifstream t("./document.json");
  std::string str((std::istreambuf_iterator<char>(t)),
                  std::istreambuf_iterator<char>());
  rapidjson::Document document;
  document.Parse(str.c_str());
  rapidjson::Value::ConstMemberIterator iter = document.FindMember("name");
  if(iter != document.MemberEnd()){
    cout << "name : " << iter->value.GetString() << endl;
  iter = document.FindMember("gender");
  if(iter != document.MemberEnd()){
    cout << "gender : " << iter->value.GetString() << endl;
  if(document.HasMember("hobby")){
    cout << "hobby : " << endl;
    const rapidjson::Value& childValue = document["hobby"];
    for(rapidjson::SizeType i = 0; i < childValue.Size(); ++i){
      cout << "    " << childValue[i].GetString() << endl;
  if(document.HasMember("score")){
    cout << "score : " << endl;
    const rapidjson::Value& childIter = document["score"];
    for(rapidjson::Value::ConstMemberIterator it = childIter.MemberBegin(); it != childIter.MemberEnd(); ++it){
      cout << "    " << it->name.GetString() << " : " << it->value.GetDouble() << endl;
  if(document.HasMember("lover")){
    cout << "lover : " << endl;
    const rapidjson::Value& chileValue = document["lover"];
    rapidjson::Value::ConstMemberIterator chileIter = chileValue.FindMember("name");
    if(chileIter != chileValue.MemberEnd()){
      cout << "    " << "name : " << chileIter->value.GetString() << endl;
    chileIter = chileValue.FindMember("gender");
    if(chileIter != chileValue.MemberEnd()){
      cout << "    " << "gender : " << chileIter->value.GetString() << endl;
    if(chileValue.HasMember("hobby")){
      cout << "    " << "hobby : " << endl;
      const rapidjson::Value& chile2Value = chileValue["hobby"];
      for(rapidjson::SizeType i = 0; i < chile2Value.Size(); ++i){
        cout << "        " << chile2Value[i].GetString() << endl;
    if(chileValue.HasMember("score")){
      cout << "    " << "score : " << endl;
      const rapidjson::Value& child2Iter = chileValue["score"];
      for(rapidjson::Value::ConstMemberIterator it = child2Iter.MemberBegin(); it != child2Iter.MemberEnd(); ++it){
        cout << "        " << it->name.GetString() << " : " << it->value.GetDouble() << endl;

输出结果:

C++之RapidJSON生成json数据

感谢开源! git上有很多解析json的库文件,比如常见的JsonCpp、cJSON等,这些都能满足正常使用。但一旦有了速度、轻量化、简便的追求,就不得不比较一下各个库的优劣了。 荡某乎上的一张各种比较json的性能图,可以看出,rapdJson处于领先地位! 楼主自从体验了rapidJson,就果断放弃了JsonCpp,原因也很简单! RapidJson的github地址: https://github.com/Tencent/rapidjson 只有头文件,也只需要包含头文件!jsoncpp还需要内置 RapidJSON是一个高效的C++ JSON解析器和生成器。它专注于性能和易用性,使得处理JSON数据变得简单和快速。RapidJSON支持现代的JSON特性,如嵌套对象、数组、Unicode编码和注释。它的API简洁易用,可以轻松解析和生成JSON数据。无论你的项目需要处理大量的JSON数据,还是只需要解析或生成少量的JSON数据,RapidJSON都能提供出色的性能和便利的API,成为你的理想选择。 REST现在是非常流行的一种接口了,但对于C++这种古董语言来说,用起来并不很方便。无论是json操作还是http交互,用起来都比较麻烦。 如果你需要在c++中使用rest操作时,不妨试一下微软的cpprestsdk,由于语法本身的原因,还是不像C#之类的语言用起来那么简洁,但至少在C++的库中来说还算非常不错的了。 这里有几篇文章可以快速帮你了解这个库的用法: 使用微软的 C++ REST... REST(Representational State Transfer)是一种基于HTTP协议的软件架构风格,它使用标准的HTTP方法(如GET、POST、PUT和DELETE)来进行资源的创建、读取、更新和删除操作。我们将使用C++编写代码来创建一个简单的RESTful API服务,并展示如何处理不同的HTTP请求和路由。你可以根据具体的需求来扩展和定制这个服务,例如添加更多的路由和处理函数,与数据库进行交互,进行身份验证等。在这些处理函数中,我们可以根据具体的业务逻辑来处理不同类型的HTTP请求。