• c++-json(0)-rapidjson-read-write-实例代码


    RapidJson是一个跨平台的c++的json的解析器和生成器;
    相比较jsoncpp库,RapidJson只有头文件,容易安装;
    RapidJSON 不依赖STL和boost等外部库独立;
    只使用如下文件:, , , , , ;
    高性能,使用模版及内联函数去降低函数调用开销、内部经优化的 Grisu2 及浮点数解析实现、可选的 SSE2/SSE4.2 支持.
    

    0.添加库头文件到工程文件中


       

      属性->c/c++/附加包含目录:
           D:\C++-httpserver-json-redis\httpserver_json\httpserver_json\rapidjson


     

    1. #include
    2. #include "rapidjson/document.h"
    3. #include "rapidjson/writer.h"
    4. #include "rapidjson/stringbuffer.h"
    5. using namespace std;
    6. using namespace rapidjson;



      

    1.创建json文件

       

     没有文件创建文件,有文件读取文件.

    1. CFile m_fileJson;
    2. BOOL flage_open = m_fileJson.Open(strInFileName , CFile::modeRead);
    3. if(flage_open == FALSE)//说明该json文件没有提前被创建
    4. {
    5. m_fileJson.Open(strInFileName,CFile::modeCreate);
    6. }
    7. else
    8. {
    9. DWORD len = m_fileJson.GetLength();
    10. char* filebuf = new char(len + 1);
    11. filebuf[len] = '\0'; //终止字符串,用于输出
    12. m_fileJson.SeekToBegin();
    13. m_fileJson.Read(filebuf, sizeof(char) * len); //缓冲区的长度
    14. }
    15. m_fileJson.Close();

      

    2.读取的json文件
     

    1. {
    2. "35KV_JXNEPYHBDS_102EDJX": {
    3. "MPf": "0",
    4. "device_id": "35KV_JXNEPYHBDS_102EDJX",
    5. "F": "50",
    6. "I0": "2.8799999",
    7. "UA": "5.92",
    8. "UB": "0.01",
    9. "UC": "5.91",
    10. "P": "0",
    11. "JXDDY": "0",
    12. "Q": "0",
    13. "JXGDY": "0",
    14. "event_time_utc": "20220620T070750Z",
    15. "Ia": "6.24",
    16. "BreakStatus": "1",
    17. "Ic": "6.72",
    18. "U0": "3.4299998",
    19. "event_time": "2022-06-20 15:07:50"
    20. },
    21. "35KV_ZHUJINGKOU_YHJX": {
    22. "MPf": "0.644",
    23. "JXGFE": "0",
    24. "device_id": "35KV_ZHUJINGKOU_YHJX",
    25. "SignalReset": "0",
    26. "P": "10.4",
    27. "HandcartStatus": "1",
    28. "Q": "-12.34",
    29. "TVDX": "0",
    30. "GL2D": "0",
    31. "event_time_utc": "20220620T070750Z",
    32. "LocalOperation": "1",
    33. "GL3D": "0",
    34. "Ia": "124.8",
    35. "BreakStatus": "1",
    36. "Ib": "0",
    37. "GL1D": "0",
    38. "Ic": "124.600006",
    39. "DeviceMaintenance": "0",
    40. "event_time": "2022-06-20 15:07:50",
    41. "SprChargStatus": "0"
    42. }
    43. }


     

    3.读取并解析json文件

     

    1. //1.读取文件
    2. DWORD len = m_infileJson.GetLength();
    3. char* filebuf = new char(len + 1);
    4. filebuf[len] = '\0'; //终止字符串,用于输出
    5. m_infileJson.SeekToBegin();
    6. m_infileJson.Read(filebuf, sizeof(char) * len); //缓冲区的长度
    7. //2.读取解析json
    8. // 2.1 文件流入doc中
    9. // 2.2 遍历 读入到容器 ConstMemberIterator devit;
    10. // string key=(devit->name).GetString();
    11. // const rapidjson::Value& devvalue = devit->value; //value根据类型解析
    12. Document jsondom_read;
    13. char* jsondata;
    14. jsondata = filebuf;
    15. jsondom_read.Parse(jsondata);
    16. if (jsondom_read.HasParseError())
    17. {
    18. printf("parse error: (%d:%d)%s\n", jsondom_read.GetParseError(), jsondom_read.GetErrorOffset(), GetParseError_En(jsondom_read.GetParseError()));
    19. return;
    20. }
    21. else
    22. {
    23. //3.读取数据
    24. Value::ConstMemberIterator devit;
    25. for (devit = jsondom_read.MemberBegin(); devit != jsondom_read.MemberEnd(); ++devit)
    26. {
    27. string devkey = (devit->name).GetString(); //dev key值 最外面一层
    28. const char* ch = devkey.c_str();
    29. const rapidjson::Value& devvalue = devit->value;//value
    30. if (devvalue.IsObject()) //dev遍历
    31. {
    32. Value::ConstMemberIterator itemit;
    33. for (itemit = jsondom_read[ch].MemberBegin(); itemit != jsondom_read[ch].MemberEnd(); ++itemit)//item遍历
    34. {
    35. string itemkey = (itemit->name).GetString();
    36. const rapidjson::Value& itemvalue = itemit->value;
    37. if (itemvalue.IsString())
    38. {
    39. string stritemvalue = (itemit->value).GetString();
    40. }
    41. }
    42. }

    4.写入到json文件
     

    4.1Addmember构造json->文件流

    1. Document jsondoc_write_addmember; //1.构建一个document
    2. jsondoc_write_addmember.SetObject();
    3. // 2.添加 字符常量
    4. const char* name = "success_url";
    5. const char* value = "https://www.google.com";
    6. jsondoc_write_addmember.AddMember(rapidjson::StringRef(name), rapidjson::StringRef(value), jsondoc_write_addmember.GetAllocator());
    7. // 3.添加 json object
    8. rapidjson::Value info_objects(rapidjson::kObjectType);
    9. std::string jsonObject = "json_object";
    10. info_objects.AddMember(rapidjson::StringRef("class_room"), rapidjson::StringRef("NO. 6110"), jsondoc_write_addmember.GetAllocator());
    11. info_objects.AddMember(rapidjson::StringRef("teacher_name"), rapidjson::StringRef("ZhangSanfeng"), jsondoc_write_addmember.GetAllocator());
    12. jsondoc_write_addmember.AddMember(rapidjson::StringRef(jsonObject.c_str()), info_objects, jsondoc_write_addmember.GetAllocator());
    13. // 4.添加json array
    14. rapidjson::Value array_objects(rapidjson::kArrayType);
    15. for (int i = 0; i < 2; i++)
    16. {
    17. rapidjson::Value object(rapidjson::kObjectType);
    18. rapidjson::Value nobject(rapidjson::kNumberType);
    19. nobject.SetInt(i);
    20. object.AddMember(rapidjson::StringRef("id"), nobject, jsondoc_write_addmember.GetAllocator());
    21. object.AddMember(rapidjson::StringRef("name"), rapidjson::StringRef("zhangsan"), jsondoc_write_addmember.GetAllocator());
    22. array_objects.PushBack(object, jsondoc_write_addmember.GetAllocator());
    23. }
    24. char* jsonArrayName = "jsonArrayName";
    25. jsondoc_write_addmember.AddMember(rapidjson::StringRef(jsonArrayName), array_objects, jsondoc_write_addmember.GetAllocator());
    26. //5.jsondom中的buffer 转换成C++ 文件流用于存成文件
    27. rapidjson::StringBuffer buffer;
    28. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    29. jsondoc_write_addmember.Accept(writer);
    30. FILE* fp;
    31. fopen_s(&fp, "D:\\testdata\\out_simple_addmember.json", "w");
    32. if (fp)
    33. {
    34. fputs(buffer.GetString(), fp);
    35. fclose(fp);
    36. }

    4.2writer 构造json->文件流

    1. //1.Writer 用法:
    2. // StartObject();
    3. // writer.Key("hello");
    4. // writer.String("world");
    5. // writer.EndObject();
    6. rapidjson::StringBuffer writerbuf;
    7. rapidjson::Writer<StringBuffer> writer(writerbuf);
    8. writer.StartObject(); // Between StartObject()/EndObject(),
    9. writer.Key("hello"); // output a key,
    10. writer.String("world"); // follow by a value.
    11. writer.Key("t");
    12. writer.Bool(true);
    13. writer.Key("f");
    14. writer.Bool(false);
    15. writer.Key("n");
    16. writer.Null();
    17. writer.Key("i");
    18. writer.Uint(123);
    19. writer.Key("pi");
    20. writer.Double(3.1416);
    21. writer.Key("a");
    22. writer.StartArray();
    23. for (unsigned i = 0; i < 4; i++)
    24. writer.Uint(i);
    25. writer.EndArray();
    26. writer.EndObject();
    27. writerbuf.GetString(); //数据内容放在 writerbuf中 文件流
    28. FILE* fp;
    29. fopen_s(&fp, "D:\\testdata\\out_simple_writer.json", "w");
    30. if (fp)
    31. {
    32. fputs(writerbuf.GetString(), fp);
    33. fclose(fp);
    34. }


     

     4.3 writer 支持的类型

      

    1. writer.StartObject();
    2. //1. 整数类型
    3. writer.Key("Int");
    4. writer.Int(1);
    5. //2. 浮点类型
    6. writer.Key("Double");
    7. writer.Double(12.0000001);
    8. //3. 字符串类型
    9. writer.Key("String");
    10. writer.String("This is a string");
    11. //4. 结构体类型
    12. writer.Key("Object");
    13. writer.StartObject();
    14. writer.Key("name");
    15. writer.String("qq849635649");
    16. writer.Key("age");
    17. writer.Int(25);
    18. writer.EndObject();
    19. //5. 数组类型
    20. //5.1 整型数组
    21. writer.Key("IntArray");
    22. writer.StartArray();
    23. //顺序写入即可
    24. writer.Int(10);
    25. writer.Int(20);
    26. writer.Int(30);
    27. writer.EndArray();
    28. //5.2 浮点型数组
    29. writer.Key("DoubleArray");
    30. writer.StartArray();
    31. for (int i = 1; i < 4; i++)
    32. {
    33. writer.Double(i * 1.0);
    34. }
    35. writer.EndArray();
    36. //5.3 字符串数组
    37. writer.Key("StringArray");
    38. writer.StartArray();
    39. writer.String("one");
    40. writer.String("two");
    41. writer.String("three");
    42. writer.EndArray();
    43. //5.4 混合型数组
    44. //这说明了,一个json数组内容是不限制类型的
    45. writer.Key("MixedArray");
    46. writer.StartArray();
    47. writer.String("one");
    48. writer.Int(50);
    49. writer.Bool(false);
    50. writer.Double(12.005);
    51. writer.EndArray();
    52. //5.5 结构体数组
    53. writer.Key("People");
    54. writer.StartArray();
    55. for (int i = 0; i < 3; i++)
    56. {
    57. writer.StartObject();
    58. writer.Key("name");
    59. writer.String("qq849635649");
    60. writer.Key("age");
    61. writer.Int(i * 10);
    62. writer.Key("sex");
    63. writer.Bool((i % 2) == 0);
    64. writer.EndObject();
    65. }
    66. writer.EndArray();
    67. writer.EndObject();


        

    5.C++中string、char *、char[]、const char*的转换

    1) char*转string:可以直接赋值。
    2) char[]转string:可以直接赋值。
    3) char*转char[]:不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用strcpy_s等函数。
    4) string转char[]:不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用strcpy_s等函数
    5) string转char*:调用string对象的c_str函数或data函数或copy函数。
    6) char[]转char*:直接赋值即可。

    使用时,要对源格式和目标格式进行初始化。源格式赋值为具体的内容,目标格式赋值为空。


  • 相关阅读:
    Openstack云计算架构及前期服务搭建
    MySQL数据库优化总结
    函数,递归以及dom简单操作
    HTTP详细总结
    Object转List<>,转List<Map<>>
    贪心+二分+DP+矩阵快速幂:CF461E
    VMware虚拟机以及centos7入门安装教程
    展开说说:Android之SharedPreferences
    java list set 特性
    Cannot deserialize value of type `java.util.Date` from String
  • 原文地址:https://blog.csdn.net/aggie4628/article/details/133820984