使用RapidJson开源库解析和生成Json数据

RapidJSON介绍

  • RapidJSON是一个高效、轻量级的 C++ JSON 解析器及生成器库,由腾讯公司开源。
  • RapidJSON 是只有头文件的 C++ 库。只需把 include/rapidjson 目录复制到项目中即可使用。
  • 中文文档

使用介绍

基础json数据生成

  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            // 创建一个新的 JSON 对象
            rapidjson::Document doc;
            doc.SetObject();
      
            
            /*
            * rapidjson::StringRef("John") 对源字符串进行了引用,不进行字符串的拷贝
            * rapidjson::Value("John")     对源字符串进行了拷贝
            */
        
            // 添加成员
            // doc.AddMember("name", rapidjson::StringRef("John"), doc.GetAllocator()); 
            doc.AddMember("name", rapidjson::Value("John").Move(), doc.GetAllocator());
            doc.AddMember("age", rapidjson::Value(30).Move(), doc.GetAllocator());
            doc.AddMember("score", rapidjson::Value(90.5).Move(), doc.GetAllocator());
      
            // 创建字符串缓冲区和写入器
            rapidjson::StringBuffer buffer;
            rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
      
            // 将文档写入缓冲区
            doc.Accept(writer);
      
            // 输出生成的 JSON 字符串
            std::cout << buffer.GetString() << std::endl;
      
            return 0;
        }
      
  • 生成结果(为了查看方便,对结果手动进行了换行)
    •   {
            "name":"John",
            "age":30,
            "score":90.5
        }
      

多级json数据生成

  • 代码

    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            // 创建 RapidJson 文档对象和内存分配器
            rapidjson::Document doc;
            doc.SetObject();
            rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
      
            doc.AddMember("code", rapidjson::Value(10010).Move(), allocator);
      
            // 第一层数据
            doc.AddMember("person", rapidjson::Value().SetObject(), allocator);
            doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator);
            doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator);
            doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator);
      
            doc.AddMember("class", rapidjson::Value("5").Move(), allocator);
      
            // 序列化 JSON 到字符串
            rapidjson::StringBuffer buffer;
            rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
            doc.Accept(writer);
      
            // 输出生成的 JSON 字符串
            std::cout << buffer.GetString() << std::endl;
      
            return 0;
        }
      
  • 生成结果

    •   {
            "code":10010,
            "person":{
                "name":"John",
                "age":30,
                "score":90.5
            },
            "class":"5"
        }
      

含有数组的json数据生成

  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            // 创建 RapidJson 文档对象和内存分配器
            rapidjson::Document doc;
            doc.SetObject();
            rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
      
            doc.AddMember("code", rapidjson::Value(10010).Move(), allocator);
      
            // 第一层数据
            doc.AddMember("person", rapidjson::Value().SetObject(), allocator);
            doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator);
            doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator);
            doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator);
      
            doc.AddMember("class", rapidjson::Value("5").Move(), allocator);
      
      
            rapidjson::Value interests(rapidjson::kArrayType);
            interests.PushBack(rapidjson::Value("math").Move(), allocator);
            interests.PushBack(rapidjson::Value("chinese").Move(), allocator);
            interests.PushBack(rapidjson::Value("english").Move(), allocator);
            doc.AddMember("lesson", interests, allocator);
      
      
            // 序列化 JSON 到字符串
            rapidjson::StringBuffer buffer;
            rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
            doc.Accept(writer);
      
            // 输出生成的 JSON 字符串
            std::cout << buffer.GetString() << std::endl;
      
            return 0;
        }
      
  • 生成结果
    •   {
            "code":10010,
            "person":{
                "name":"John",
                "age":30,
                "score":90.5
            },
            "class":"5",
            "lesson":["math","chinese","english"]
        }
      

含有数组对象的json数据生成

  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            // 创建 RapidJson 文档对象和内存分配器
            rapidjson::Document doc;
            doc.SetObject();
            rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
      
            doc.AddMember("code", rapidjson::Value(10010).Move(), allocator);
      
            doc.AddMember("person", rapidjson::Value().SetObject(), allocator);
            doc["person"].AddMember("name", rapidjson::Value("John").Move(), allocator);
            doc["person"].AddMember("age", rapidjson::Value(30).Move(), allocator);
            doc["person"].AddMember("score", rapidjson::Value(90.5).Move(), allocator);
      
            doc.AddMember("class", rapidjson::Value("5").Move(), allocator);
      
      
            rapidjson::Value array(rapidjson::kArrayType);
            array.SetArray();
      
            rapidjson::Value obj1(rapidjson::kObjectType);
            obj1.AddMember("lessonName", rapidjson::StringRef("math"), allocator);
            obj1.AddMember("time", rapidjson::Value(8).Move(), allocator);
            array.PushBack(obj1.Move(), allocator);
      
            rapidjson::Value obj2(rapidjson::kObjectType);
            obj2.AddMember("lessonName", rapidjson::StringRef("chinese"), allocator);
            obj2.AddMember("time", rapidjson::Value(9).Move(), allocator);
            array.PushBack(obj2.Move(), allocator);
      
            rapidjson::Value obj3(rapidjson::kObjectType);
            obj3.AddMember("lessonName", rapidjson::StringRef("english"), allocator);
            obj3.AddMember("time", rapidjson::Value(6).Move(), allocator);
            array.PushBack(obj3.Move(), allocator);
      
            doc.AddMember("lesson", array, allocator);
      
      
            // 序列化 JSON 到字符串
            rapidjson::StringBuffer buffer;
            rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
            doc.Accept(writer);
      
            // 输出生成的 JSON 字符串
            std::cout << buffer.GetString() << std::endl;
      
            return 0;
        }
      
  • 生成结果
    •   {
            "code":10010,
            "person":{
                "name":"John",
                "age":30,
                "score":90.5
            },
            "class":"5",
            "lesson":[
                {"lessonName":"math","time":8},
                {"lessonName":"chinese","time":9},
                {"lessonName":"english","time":6}
            ]
        }
      

基础json数据解析

  • json数据
    •   {
            "name": "John", 
            "age": 30, 
            "score": 19.5
        }
      
  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            const char* jsonStr = "{\"name\": \"John\", \"age\": 30, \"score\": 19.5}";
      
      
            // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据
            rapidjson::Document d;
            
            // 2. 使用 Parse 函数解析 JSON 字符串
            // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON
            d.Parse(jsonStr);
      
            // 3. 检查解析是否成功
            if (d.HasParseError()) {
                std::cerr << "JSON parse error: " << d.GetParseError() << std::endl;
                return -1;
            }
      
            // 4. 访问 JSON 数据
            if (d.HasMember("name") && d["name"].IsString()) {
                std::cout << "Name: " << d["name"].GetString() << std::endl;
            }
            if (d.HasMember("age") && d["age"].IsInt()) {
                std::cout << "age: " << d["age"].GetInt() << std::endl;
            }
            if (d.HasMember("score") && d["score"].IsFloat()) {
                std::cout << "score: " << d["score"].GetFloat() << std::endl;
            }
      
            return 0;
        }
      
  • 打印
    •   Name: John
        age: 30
        score: 19.5
      

多级json数据解析

  • json数据
    •   {
            "code": 10010, 
            "person": {
                "name": "John", 
                "age": 30,
                "score": 90.5 
            },
            "class": "5"
        }
      
  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            const char* jsonStr = "{\"code\": 10010, \"person\": {\"name\": \"John\", \"age\": 30,\"score\": 90.5 },\"class\": \"5\"}";
      
      
            // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据
            rapidjson::Document d;
            
            // 2. 使用 Parse 函数解析 JSON 字符串
            // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON
            d.Parse(jsonStr);
      
            // 3. 检查解析是否成功
            if (d.HasParseError()) {
                std::cerr << "JSON parse error: " << d.GetParseError() << std::endl;
                return -1;
            }
      
            if (d.HasMember("code") && d["code"].IsInt()) {
                std::cout << "code: " << d["code"].GetInt() << std::endl;
            }
      
            if (d.HasMember("person")) {
                if (d["person"].HasMember("name") && d["person"]["name"].IsString()) {
                    std::cout << "person->name: " << d["person"]["name"].GetString() << std::endl;
                }
      
                if (d["person"].HasMember("age") && d["person"]["age"].IsInt()) {
                    std::cout << "person->age: " << d["person"]["age"].GetInt() << std::endl;
                }
      
                if (d["person"].HasMember("score") && d["person"]["score"].IsFloat()) {
                    std::cout << "person->score: " << d["person"]["score"].GetFloat() << std::endl;
                }
            }
      
            if (d.HasMember("class") && d["class"].IsString()) {
                std::cout << "class: " << d["class"].GetString() << std::endl;
            }
      
            return 0;
        }
      
  • 打印
    •   code: 10010
        person->name: John
        person->age: 30
        person->score: 90.5
        class: 5
      

含有数组的json数据解析

  • json数据
    •   {
            "code": 10010, 
            "lesson": ["math", "chinese", "english"], 
            "class": "5"
        }
      
  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            const char* jsonStr = "{\"code\": 10010, \"lesson\": [\"math\", \"chinese\", \"english\"], \"class\": \"5\"}";
      
      
            // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据
            rapidjson::Document d;
            
            // 2. 使用 Parse 函数解析 JSON 字符串
            // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON
            d.Parse(jsonStr);
      
            // 3. 检查解析是否成功
            if (d.HasParseError()) {
                std::cerr << "JSON parse error: " << d.GetParseError() << std::endl;
                return -1;
            }
      
            if (d.HasMember("code") && d["code"].IsInt()) {
                std::cout << "code: " << d["code"].GetInt() << std::endl;
            }
      
            if (d.HasMember("lesson") && d["lesson"].IsArray()) {
                const rapidjson::Value& lesson = d["lesson"];
                std::cout << "lesson";
                for (rapidjson::SizeType i = 0; i < lesson.Size(); i++) {
                    if (lesson[i].IsString()) {
                        std::cout << "\t" << lesson[i].GetString() << std::endl;
                    }
                }
                
            }
      
            if (d.HasMember("class") && d["class"].IsString()) {
                std::cout << "class: " << d["class"].GetString() << std::endl;
            }
      
            return 0;
        }
      
  • 打印
    •   code: 10010
        lesson  math
                chinese
                english
        class: 5
      

含有数组对象的json数据解析

  • json数据
    •   {
            "code": 10010, 
            "lesson":[
                {"lessonName": "math", "time": 8},
                {"lessonName": "chinese", "time": 9},
                {"lessonName": "english", "time":6}
            ]
        }
      
  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            const char* jsonStr = "{\"code\": 10010, \"lesson\":[{\"lessonName\": \"math\", \"time\": 8},{\"lessonName\": \"chinese\", \"time\": 9},{\"lessonName\": \"english\", \"time\":6}]}";
      
            // 1. 创建一个 RapidJSON 的 Document 对象来持有 JSON 数据
            rapidjson::Document d;
            
            // 2. 使用 Parse 函数解析 JSON 字符串
            // 参数ParseFlag::kParseComments 是可选的,用于允许解析带注释的 JSON
            d.Parse(jsonStr);
      
            // 3. 检查解析是否成功
            if (d.HasParseError()) {
                std::cerr << "JSON parse error: " << d.GetParseError() << std::endl;
                return -1;
            }
      
            if (d.HasMember("code") && d["code"].IsInt()) {
                std::cout << "code: " << d["code"].GetInt() << std::endl;
            }
      
      
            if (d.HasMember("lesson") && d["lesson"].IsArray()) {
                const rapidjson::Value& employeesArray = d["lesson"];
                for (rapidjson::SizeType i = 0; i < employeesArray.Size(); i++) {
                    if (employeesArray[i].IsObject()) {
                        const rapidjson::Value& employee = employeesArray[i];
      
                        std::cout << "lesson " << i << ":" << std::endl;
                        if (employee.HasMember("lessonName") && employee["lessonName"].IsString()) {
                            std::cout << "\t" << "lessonName: " << employee["lessonName"].GetString() << std::endl;
                        }
                        if (employee.HasMember("time") && employee["time"].IsInt()) {
                            std::cout << "\t" << "time: " << employee["time"].GetInt() << std::endl;
                        }
                    }
                }
            }
      
            return 0;
        }
      
  • 打印
    •   code: 10010
        lesson 0:
                lessonName: math
                time: 8
        lesson 1:
                lessonName: chinese
                time: 9
        lesson 2:
                lessonName: english
                time: 6
      

修改、移除、新增json节点

  • json数据
    •   {
            "code": 10010, 
            "person": {
                "name": "John", 
                "age": 30,
                "score": 90.5 
            },
            "class": "5"
        }
      
  • 代码
    •   #include <iostream>
        #include "rapidjson/document.h"    // 快速JSON文档操作
        #include "rapidjson/writer.h"      // JSON写入器
        #include "rapidjson/stringbuffer.h" // 字符串缓冲区,用于存放生成的JSON字符串
      
        int main(){
            // 1. 把 JSON 解析至 DOM。
            const char* json = "{\"code\": 10010, \"person\": {\"name\": \"John\", \"age\": 30,\"score\": 90.5 },\"class\": \"5\"}";
            rapidjson::Document d;
            d.Parse(json);
        
            // 2. 利用 DOM 作出修改。
            rapidjson::Value& code = d["code"];
            code.SetInt(10020);
      
            rapidjson::Value& name = d["person"]["name"];
            name.SetString("Jack");
      
            // 移除某个节点
            d.RemoveMember("class");
      
            // 新增节点
            rapidjson::Value newValue("6", d.GetAllocator());
            d.AddMember("classTemp", newValue, d.GetAllocator());
        
            // 3. 把 DOM 转换(stringify)成 JSON。
            rapidjson::StringBuffer buffer;
            rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
            d.Accept(writer);
        
            std::cout << buffer.GetString() << std::endl;
            return 0;
        }
      
  • 打印
    •   {
            "code":10020,
            "person":{
                "name":"Jack",
                "age":30,
                "score":90.5
            },
            "classTemp":"6"
        }
      
  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 导入JSON解析:首先需要将JSON解析导入项目中,可以通过Maven或Gradle等方式引入。 2. 创建JSON对象:使用JSON解析提供的方法,根据JSON字符串创建一个JSON对象。 3. 解析JSON数据:可以通过JSON对象提供的方法,获取其中的数据。 4. 遍历JSON数据:可以使用循环结构,遍历JSON数据,获取其中的所有数据。 5. 转换JSON数据:可以将JSON数据转换为Java对象或其他类型的数据,方便后续的操作。 6. 错误处理:在解析JSON数据的过程中,可能会出现错误,需要进行错误处理,保证程序的正常运行。 下面是一个使用Jackson解析JSON数据的示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class JsonParser { public static void main(String[] args) { String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; ObjectMapper objectMapper = new ObjectMapper(); try { // 创建JSON对象 JsonNode jsonNode = objectMapper.readTree(jsonString); // 获取JSON数据 String name = jsonNode.get("name").asText(); int age = jsonNode.get("age").asInt(); String city = jsonNode.get("city").asText(); // 输出JSON数据 System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("City: " + city); } catch (IOException e) { e.printStackTrace(); } } } ``` 在示例代码中,我们使用了Jackson提供的ObjectMapper类来解析JSON数据。首先,我们将一个JSON字符串转换为JSON对象;然后,通过get()方法获取JSON数据;最后,将获取的数据输出到控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值