Skip to content

结构体或类对象json_encode json_decode使用方法

Huang ziquan edited this page Apr 24, 2023 · 10 revisions

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

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|]:

json_encode json_decode 使用

创建一个测试文件 controller/src/testjsonreflect.cpp

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目录编译,然后浏览器查看

http://www.xxx.com/testjsonreflect

json