-
Notifications
You must be signed in to change notification settings - Fork 60
结构体或类对象json_encode json_decode使用方法
C++ 没有内置对象到JSON字符串,也没有JSON字符串到对象,Paozhu框架提供这个两个转换类库。
框架提供了 json_encode json_decode两个函数操作 结构体或类对象
std::string json_encode(obj)
std::string json_encode(std::vector<obj>)
表示把对象编码为JSON 支持数组或单个对象
int json_decode(obj,json_string)
int json_decode(std::vector<obj>,json_string)
表示解码JSON字符串到对象
common/json_reflect_headers.h 是所有反射对象引用的头文件
这个文件是paozhu_cli生成的
你要在libs目录下创建相应的类型文件,然后运行paozhu_cli生成, 框架是直接分析类型文件生成相应的代码,目前支持常用的结构体, 结构体可以多层嵌套,或引用同样是反射的结构体。
在libs目录下创建一个文件或文件夹,如果多的话建议使用文件夹分类文件 我们创建一个department目录,在底下创建一个类型文件department_type.h
#ifndef LIBS_DEPARTMENT_TYPE_H
#define LIBS_DEPARTMENT_TYPE_H
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <sstream>
#include "unicode.h"
namespace psy
{
//@reflect json to_json from_json
struct department_outjson_t
{
unsigned int id = 0;
unsigned int key = 0;
unsigned int value = 0;
unsigned int parentid = 0;
unsigned int bianzhi_num = 0;
bool isopen = true;
bool _is_use = false;
std::string title;
std::string desc;
std::vector<department_outjson_t> children;
std::string to_json(std::string aa="",int offset=0);
unsigned int from_json()
{
//**aaaaa
/*
aaaa [][}]
*/
char b='}';
if(b=='{')
{
std::cout<<"assss}sss}{ssss}sss}"<<std::endl;
}
return 0;
}
};
//@reflect json to_json from_json
struct department_listoutjson_t
{
unsigned int code=0;
struct department_tables
{
std::vector<department_outjson_t> list;
unsigned int total=0;
} data;
std::vector<std::vector<std::string>> names;
};
} // namespace psy
#endif
//@reflect json
是框架分析源码提取标志,必须是这个开头的struct或class,不然不起作用。
我们创建两个结构体,后面一个还嵌套一个,这样方便业务代码操作 to_json from_json 是测试框架分析源代码是不是正确跳过这些函数
下划线开头不会输出到JSON字符串里面
在项目根目录 运行
sudo ./bin/paozhu_cli
或者直接运行
./bin/paozhu_cli json
./bin/paozhu_cli model | view | viewtocpp | control
🎉 Welcome to use cli to manage your MVC files。
(m)model (v)view (f)viewtocpp or (c)control , (j)son ,x or q to exit[input m|v|f|c|j|]:
输入 j
可以看到生成文件了
1 /Users/hzq/paozhu/libs/department/department_type_jsonreflect.cpp
(m)model (v)view (f)viewtocpp or (c)control , (j)son ,x or q to exit[input m|v|f|c|j|]:
创建一个测试文件 controller/src/testjsonreflect.cpp
#include <chrono>
#include <thread>
#include "httppeer.h"
#include "testjsonreflect.h"
#include "json_reflect_headers.h"
#include "array_to_tree.h"
namespace http
{
//@urlpath(null,testjsonreflect)
std::string testjsonreflect(std::shared_ptr<httppeer> peer)
{
httppeer &client = peer->getpeer();
// client << " json reflect 🧨 Paozhu c++ web framework ";
psy::department_outjson_t deps_json_one;
std::vector<psy::department_outjson_t> depsjsonlist;
deps_json_one.id = 38;
deps_json_one.key = 38;
deps_json_one.value = 38;
deps_json_one.parentid = 0;
deps_json_one.isopen = true;
deps_json_one.title = "First Item 第一条";
deps_json_one.desc = "First Item 第一条备注";
deps_json_one.bianzhi_num = 12;
depsjsonlist.push_back(deps_json_one);
deps_json_one.id = 48;
deps_json_one.key = 48;
deps_json_one.value = 48;
deps_json_one.parentid = 0;
deps_json_one.isopen = true;
deps_json_one.title = "Second Item 第二条";
deps_json_one.desc = "Second memo 第二条备注";
deps_json_one.bianzhi_num = 16;
depsjsonlist.push_back(deps_json_one);
deps_json_one.id = 58;
deps_json_one.key = 58;
deps_json_one.value = 58;
deps_json_one.parentid = 48;
deps_json_one.isopen = true;
deps_json_one.title = "Three Item 第二条01";
deps_json_one.desc = "Three memo 第二条01备注";
deps_json_one.bianzhi_num = 22;
depsjsonlist.push_back(deps_json_one);
psy::department_listoutjson_t depout_data;
array_to_tree<psy::department_outjson_t>(depout_data.data.list, depsjsonlist);
depout_data.code = 0;
// depout_data.data.list=depsjsonlist; //has array_to_tree
depout_data.data.total = 0;
std::string jsondep_str = psy::json_encode(depout_data);
psy::department_listoutjson_t new_depout_data;
psy::json_decode(new_depout_data, jsondep_str);
std::cout << "data.list:" << depout_data.data.list.size() << std::endl;
std::cout << "data.list:" << new_depout_data.data.list.size() << std::endl;
std::string jsondep_str_temp = psy::json_encode(new_depout_data);
client << jsondep_str_temp;
client.out_jsontype();
return "";
}
} // namespace http
我们先把数组转为树,然后测试对象编码为JSON字符串
先std::string jsondep_str = psy::json_encode(depout_data);
然后 在用这个 jsondep_str 解码到新的对象
psy::json_decode(new_depout_data, jsondep_str);
然后我们再次 编码 std::string jsondep_str_temp = psy::json_encode(new_depout_data);
然后输出 jsondep_str_temp 看看是不是符合我们的预期
到build目录编译,然后浏览器查看