json_serialize.cc 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <jsoncpp/json/json.h>
  5. using std::cout;
  6. using std::endl;
  7. /*使用json完成数据的序列化工作*/
  8. std::string serialize()
  9. {
  10. // 1. 将需要序列化的数据存储在Json::Value对象中
  11. Json::Value root;
  12. root["姓名"] = "小明";
  13. root["年龄"] = 18;
  14. root["成绩"].append(80); //成绩是数组类型
  15. root["成绩"].append(90);
  16. root["成绩"].append(100);
  17. // 2. 实例化StreamWriterBuilder工厂类对象
  18. Json::StreamWriterBuilder swb;
  19. // 3. 使用StreamWriterBuilder工厂类对象实例化StreamWriter对象
  20. Json::StreamWriter *sw = swb.newStreamWriter();
  21. // 4. 使用StreamWriter对象完成Json::Value中数据的序列化工作,并将序列化结果存放到ss中
  22. std::stringstream ss;
  23. int n = sw->write(root, &ss);
  24. if(n != 0)
  25. {
  26. cout << "json serialize fail" << endl;
  27. delete sw;
  28. return "";
  29. }
  30. delete sw;
  31. return ss.str();
  32. }
  33. /*使用Json完成序列化数据的反序列化工作*/
  34. void deserialize(const std::string &str)
  35. {
  36. // 1. 实例化一个CharReaderBuilder工厂类对象
  37. Json::CharReaderBuilder crb;
  38. // 2. 使用CharReaderBuilder对象实例化一个CharReader对象
  39. Json::CharReader *cr = crb.newCharReader();
  40. // 3. 创建一个Json::Value对象,用于保存json格式字符串反序列化后的结果
  41. Json::Value root;
  42. // 4. 使用CharReader对象完成json格式字符串的反序列化工作
  43. std::string errmsg;
  44. bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &errmsg);
  45. if(ret == false)
  46. {
  47. cout << "json deserialize fail: " << errmsg << endl;
  48. delete cr;
  49. return;
  50. }
  51. // 5. 依次打印Json::Value中的数据
  52. cout << "姓名: " << root["姓名"].asString() << endl;
  53. cout << "年龄: " << root["年龄"].asInt() << endl;
  54. int size = root["成绩"].size();
  55. for(int i = 0; i < size; i++)
  56. {
  57. cout << "成绩: " << root["成绩"][i].asFloat() << endl;
  58. }
  59. }
  60. int main()
  61. {
  62. std::string str = serialize();
  63. cout << str << endl;
  64. deserialize(str);
  65. return 0;
  66. }