From f6982df9689b5da8d04e8dde9de062bf02c90985 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 11:30:57 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E6=89=A9=E5=B1=95struct2json=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81C++?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=93,=E6=94=AF=E6=8C=81string,bool?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=88=90=E5=91=98=E5=92=8C=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +- demo/error_print.txt | 2 + demo/generate_s2j_code.py | 64 ++++++++--- demo/inc/mc_usr_def.h | 30 ++--- demo/main.c | 7 ++ demo/my_struct_2_json.c | 54 ++++++++- demo/my_struct_2_json.h | 4 + demo/my_struct_2_json.inc | 26 ++++- demo/struct_defination.json | 222 ++++++++++++++---------------------- demo/struct_defination.txt | 8 ++ demo/tests2j | Bin 89040 -> 123376 bytes struct2json/inc/s2jdef.h | 55 +++++++++ 12 files changed, 297 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index 469372c..efcef7b 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,11 @@ typedef struct { #### 2) 扩展struct2json功能,增加支持结构体内包含结构体成员,支持包含数组成员。 #### 3) 增加struct2json 结构体与JSON转换代码自动生成的Python脚本,支持从头文件中提取结构体定义,并根据结构体定义自动生成结构体与JSON互转代码,并提供相关示例。 -### V2.0 使用说明: +### V2.1版本新增功能【yuxuebao】 +#### 1) 扩展struct2json功能,增加支持C++结构体,支持string,bool类型成员和数组。 + + +### V2.x 使用说明: #### 1) 提取结构体定义: 将头文件(eg:mc_usr_def.h)放在demo\inc目录下; 执行generate_struct_defination.py,生成struct_defination.txt; @@ -65,7 +69,9 @@ typedef struct { 支持的数组类型:支持基本类型一维数组,结构体一维数组,字符二维数组(字符串数组) #### 3) 测试结构体与JSON转换: cd demo - 编译测试代码,gcc ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -lm -DDEBUGS2J -g -o tests2j + 编译测试代码, + V2.0: gcc ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -lm -g -DDEBUGS2J -o tests2j + V2.1+: g++ ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -fpermissive -lm -g -DDEBUGS2J -o tests2j 测试 ./tests2j 查看output输出和生成的JSON样例文件struct_defination.json; 预期输出:*:strcmp:0 *:strcmp:0 *:json_cmp:1 diff --git a/demo/error_print.txt b/demo/error_print.txt index d8f0ca4..9a4ef24 100644 --- a/demo/error_print.txt +++ b/demo/error_print.txt @@ -1,9 +1,11 @@ +struct_para_json2bin(CppStructInfoT,bin_para,type,value) struct_para_json2bin(McUsrInfoT,bin_para,type,value) struct_para_json2bin(McBaseOrdrT,bin_para,type,value) struct_para_json2bin(McBaseOrdrArrayT,bin_para,type,value) struct_para_json2bin(McOcoBaseOrdrT,bin_para,type,value) ************************************* +struct_para_bin2json(CppStructInfoT,bin_para,type,json_para) struct_para_bin2json(McUsrInfoT,bin_para,type,json_para) struct_para_bin2json(McBaseOrdrT,bin_para,type,json_para) struct_para_bin2json(McBaseOrdrArrayT,bin_para,type,json_para) diff --git a/demo/generate_s2j_code.py b/demo/generate_s2j_code.py index d2bcdfe..dfa03f1 100644 --- a/demo/generate_s2j_code.py +++ b/demo/generate_s2j_code.py @@ -72,10 +72,10 @@ #print(array_para_name_size) para_name = para_name.split("[")[0] s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, int, "+ para_name + ","+ array_para_name_size+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_array_element(struct_obj_,json_obj, int, "+para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, int, "+ para_name + ");\n\t" else: - s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+para_name+");\n\t" - j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+para_name+");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+ para_name+");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+ para_name+");\n\t" elif para_type.find("enum")!=-1 or para_type.find("CbT")!=-1: # enum或函数指针(根据实际命名规范识别) #print(para_type) if "[" in para_name: @@ -85,30 +85,44 @@ #print(array_para_name_size) para_name = para_name.split("[")[0] s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, int, "+ para_name + ","+ array_para_name_size+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_array_element(struct_obj_,json_obj, int, "+para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, int, "+ para_name + ");\n\t" else: - s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+para_name+");\n\t" - j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+para_name+");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+ para_name+");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+ para_name+");\n\t" + elif para_type in ("string","std::string"): #c++ std::string + if "[" in para_name: # 处理c++ std::string数组的情况 + #print(para_name) + left_symbol = para_name.find("[") # 找到[位置 + right_symbol = para_name.find("]") # 找到]位置 + array_para_name_size = para_name[left_symbol+1:right_symbol] + #print(array_para_name_size) + para_name = para_name.split("[")[0] + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, stdstring, "+ para_name + ","+ array_para_name_size+");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, stdstring, "+ para_name + ");\n\t" + else: + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, stdstring, " + para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, stdstring, " + para_name + ");\n\t" else: #基本类型 - if para_type in ("char","unsigned char","signed char","int","unsigned","unsigned int","signed int","short","unsigned short","signed short","long","unsigned long","signed long","long long","unsigned long long","signed long long","BOOL","bool","size_t","uint8_t","uint16_t","uint32_t","uint64_t","int8_t","int16_t","int32_t","int64_t","uint8","uint16","uint32","uint64","int8","int16","int32","int64","uint_fast64_t","__int128_t","__uint128_t","float","double","long double"): + if para_type in ("bool","char","unsigned char","signed char","int","unsigned","unsigned int","signed int","short","unsigned short","signed short","long","unsigned long","signed long","long long","unsigned long long","signed long long","BOOL","bool","size_t","uint8_t","uint16_t","uint32_t","uint64_t","int8_t","int16_t","int32_t","int64_t","uint8","uint16","uint32","uint64","int8","int16","int32","int64","uint_fast64_t","__int128_t","__uint128_t","float","double","long double"): if para_type in ("float","double","long double","__int128_t","__uint128_t"): #浮点型、128位整型 if "[" in para_name: #print(para_name) left_symbol = para_name.find("[") # 找到[位置 right_symbol = para_name.find("]") # 找到]位置 array_para_name_size = para_name[left_symbol+1:right_symbol] + #print(array_para_name_size) para_name = para_name.split("[")[0] s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, double, "+ para_name + ","+ array_para_name_size+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_array_element(struct_obj_,json_obj, double, "+para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, double, "+ para_name + ");\n\t" else: - s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, double, "+para_name+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_basic_element(struct_obj_,json_obj, double, "+para_name+");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, double, "+ para_name+");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, double, "+ para_name+");\n\t" elif para_type =="char" : # 字符串 if "[" in para_name: para_name_item = para_name.split("[") if len(para_name_item)==2: # 处理字符数组的情况,只取名字,舍弃中括号部分 para_name = para_name_item[0] - s2j_code_str_concat = s2j_code_str_concat+ "s2j_json_set_basic_element(json_obj_, struct_obj_, string, " + para_name + ");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, string, " + para_name + ");\n\t" j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, string, " + para_name + ");\n\t" elif len(para_name_item)==3: # 处理二维字符数组的情况 para_name = para_name_item[0] @@ -116,7 +130,7 @@ right_symbol = para_name_item[1].find("]") # 找到]位置 array_para_name_size = para_name_item[1][0:right_symbol] s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, string, "+ para_name + ","+ array_para_name_size+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_array_element(struct_obj_,json_obj, string, "+para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, string, "+ para_name + ");\n\t" else: s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, " + para_name + ");\n\t" j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, " + para_name + ");\n\t" @@ -129,10 +143,10 @@ #print(array_para_name_size) para_name = para_name.split("[")[0] s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_array_element(json_obj_, struct_obj_, int, "+ para_name + ","+ array_para_name_size+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_array_element(struct_obj_,json_obj, int, "+para_name + ");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_array_element(struct_obj_,json_obj, int, "+ para_name + ");\n\t" else: - s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+para_name+");\n\t" - j2s_code_str_concat = j2s_code_str_concat +"s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+para_name+");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, int, "+ para_name+");\n\t" + j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, int, "+ para_name+");\n\t" else: #结构体类型的参数 if "[" in para_name: # usrDefLst[MAX_LIST_MEM_TYPE] @@ -143,7 +157,7 @@ s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_struct_array_element_by_func(json_obj_, struct_obj_, "+ para_type +","+para_name+ ","+list_size+");\n\t" j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_struct_array_element_by_func(struct_obj_, json_obj, "+ para_type +","+para_name+");\n\t" else: - s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_struct_element_by_func(json_obj_, struct_obj_, "+ para_type +","+para_name+ ");\n\t" + s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_struct_element_by_func(json_obj_, struct_obj_, " + para_type +","+para_name+ ");\n\t" j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_struct_element_by_func(struct_obj_, json_obj, " + para_type + "," + para_name + ");\n\t" s2j_code_str_concat_return = s2j_code_str_concat_return + s2j_code_str_concat # #"return json_obj_;\n}" @@ -199,13 +213,25 @@ #include "my_struct_2_json.inc" #include "my_struct_2_json.h" - #ifdef __cplusplus extern "C" { #endif """ void_main_header = r""" +#ifdef DEBUGS2J + + int s2j_test(void) + { +#ifdef __cplusplus + S2jHook s2jHookCpp = { + .malloc_fn = ::operator new, + .free_fn = ::operator delete, + }; + + s2j_init(&s2jHookCpp); +#endif + char file_name[] = "struct_defination.json"; FILE *fp; @@ -218,7 +244,7 @@ str_return = "" str_s2j_test = "" for i in range(len(struct_name_return.split())): - str_s2j_test = str_s2j_test + " TEST_S2J_STRUCT(" + struct_name_return.split()[i] + ", 0 , fp);\n" + str_s2j_test = str_s2j_test + " TEST_S2J_STRUCT_CPP(" + struct_name_return.split()[i] + ", 0 , fp);\n" #print(str_s2j_test) str_s2j_test_tail = r""" @@ -284,7 +310,7 @@ } #endif /* end of __cplusplus */ """ -str_return = head_str + return_code + "#ifdef DEBUGS2J \n int s2j_test(void)\n" +" {\n\t" + void_main_header + str_s2j_test + str_s2j_test_tail + str_s2j_test2_header + str_s2j_test2 + void_main_tail +str_return = head_str + return_code + "\n\t" + void_main_header + str_s2j_test + str_s2j_test_tail + str_s2j_test2_header + str_s2j_test2 + void_main_tail #print(str_return) error_return = error_print_json2bin + "\n" + "*************************************" + "\n" + error_print_bin2json diff --git a/demo/inc/mc_usr_def.h b/demo/inc/mc_usr_def.h index 4cb0b33..802fb65 100644 --- a/demo/inc/mc_usr_def.h +++ b/demo/inc/mc_usr_def.h @@ -16,28 +16,20 @@ example #include /* define string handling functions */ #ifdef __cplusplus -extern "C" { +#include +typedef struct CppStructInfoS +{ + std::string string1; + std::string stringArray2[2]; + bool b1; + bool bArray2[2]; +} CppStructInfoT, *pCppStructInfoT; #endif +#ifdef __cplusplus +extern "C" { +#endif -/***************************************************************************** - ** - ** Type Defination - ** - *****************************************************************************/ - - -/***************************************************************************** - ** - ** Macro - ** - *****************************************************************************/ - -/****************************************************************************** - ** - ** Structure - ** - ******************************************************************************/ typedef int int32; typedef long long int64; diff --git a/demo/main.c b/demo/main.c index 048941b..d770260 100644 --- a/demo/main.c +++ b/demo/main.c @@ -31,10 +31,13 @@ #include #ifdef DEBUGS2J +extern "C" { extern int s2j_test(void); extern int s2j_test2(void); +} #endif// DEBUGS2J +#ifndef DEBUGS2J typedef struct { char name[16]; } Hometown; @@ -104,8 +107,10 @@ static cJSON *struct_to_json(void* struct_obj) { /* return Student JSON object pointer */ return json_student; } +#endif int main(void) { +#ifndef DEBUGS2J static Student orignal_student_obj = { .id = 24, .weight = 71.2, @@ -128,6 +133,7 @@ int main(void) { s2j_delete_json_obj(json_student); s2j_delete_struct_obj(converted_student_obj); +#endif #ifdef DEBUGS2J s2j_test(); @@ -136,3 +142,4 @@ int main(void) { return 0; } + diff --git a/demo/my_struct_2_json.c b/demo/my_struct_2_json.c index 0398a3e..8eee7dd 100644 --- a/demo/my_struct_2_json.c +++ b/demo/my_struct_2_json.c @@ -2,11 +2,40 @@ #include "my_struct_2_json.inc" #include "my_struct_2_json.h" - #ifdef __cplusplus extern "C" { #endif +#if 0 +typedef struct CppStructInfoS +{ + std::string string1; + std::string stringArray2[2]; + bool b1; + bool bArray2[2]; +} CppStructInfoT, *pCppStructInfoT; +#endif +cJSON *struct_to_json_CppStructInfoT(void* struct_obj) +{ + s2j_create_json_obj(json_obj_); + CppStructInfoT *struct_obj_ = (CppStructInfoT *)struct_obj; + s2j_json_set_basic_element(json_obj_, struct_obj_, stdstring, string1); + s2j_json_set_array_element(json_obj_, struct_obj_, stdstring, stringArray2,2); + s2j_json_set_basic_element(json_obj_, struct_obj_, int, b1); + s2j_json_set_array_element(json_obj_, struct_obj_, int, bArray2,2); + return json_obj_; +} + +void *json_to_struct_CppStructInfoT(cJSON* json_obj) +{ + s2j_create_struct_obj(struct_obj_, CppStructInfoT); + s2j_struct_get_basic_element(struct_obj_,json_obj, stdstring, string1); + s2j_struct_get_array_element(struct_obj_,json_obj, stdstring, stringArray2); + s2j_struct_get_basic_element(struct_obj_,json_obj, int, b1); + s2j_struct_get_array_element(struct_obj_,json_obj, int, bArray2); + return struct_obj_; +} + #if 0 typedef struct McUsrInfoS { @@ -159,10 +188,21 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) s2j_struct_get_basic_element(struct_obj_,json_obj, int, pUsrDef); return struct_obj_; } + + #ifdef DEBUGS2J + int s2j_test(void) { - +#ifdef __cplusplus + S2jHook s2jHookCpp = { + .malloc_fn = ::operator new, + .free_fn = ::operator delete, + }; + + s2j_init(&s2jHookCpp); +#endif + char file_name[] = "struct_defination.json"; FILE *fp; @@ -170,10 +210,11 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) if (NULL == fp) return 1; fprintf(fp,"{\n\t\"struct\": [\n\t\t{\n\t\t\t\"type\": \"void*\",\n\t\t\t\"value\": null\n\t\t}"); - TEST_S2J_STRUCT(McUsrInfoT, 0 , fp); - TEST_S2J_STRUCT(McBaseOrdrT, 0 , fp); - TEST_S2J_STRUCT(McBaseOrdrArrayT, 0 , fp); - TEST_S2J_STRUCT(McOcoBaseOrdrT, 0 , fp); + TEST_S2J_STRUCT_CPP(CppStructInfoT, 0 , fp); + TEST_S2J_STRUCT_CPP(McUsrInfoT, 0 , fp); + TEST_S2J_STRUCT_CPP(McBaseOrdrT, 0 , fp); + TEST_S2J_STRUCT_CPP(McBaseOrdrArrayT, 0 , fp); + TEST_S2J_STRUCT_CPP(McOcoBaseOrdrT, 0 , fp); fprintf(fp,"\n\t]\n}"); fclose(fp); @@ -214,6 +255,7 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) printf("\nsize:\n%d\n",array_size); int i = 0; \ + TEST_S2J_JSON(CppStructInfoT, array_size); TEST_S2J_JSON(McUsrInfoT, array_size); TEST_S2J_JSON(McBaseOrdrT, array_size); TEST_S2J_JSON(McBaseOrdrArrayT, array_size); diff --git a/demo/my_struct_2_json.h b/demo/my_struct_2_json.h index 5547764..4a00943 100644 --- a/demo/my_struct_2_json.h +++ b/demo/my_struct_2_json.h @@ -2,6 +2,10 @@ extern "C" { #endif +cJSON *struct_to_json_CppStructInfoT(void* struct_obj); + +void *json_to_struct_CppStructInfoT(cJSON* json_obj); + cJSON *struct_to_json_McUsrInfoT(void* struct_obj); void *json_to_struct_McUsrInfoT(cJSON* json_obj); diff --git a/demo/my_struct_2_json.inc b/demo/my_struct_2_json.inc index 043ad43..bc0b8ee 100644 --- a/demo/my_struct_2_json.inc +++ b/demo/my_struct_2_json.inc @@ -27,7 +27,7 @@ */ /* -gcc ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -lm -DDEBUGS2J -g -o tests2j +g++ ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -fpermissive -lm -g -DDEBUGS2J -o tests2j */ @@ -67,6 +67,30 @@ do\ #ifdef DEBUGS2J +#define TEST_S2J_STRUCT_CPP(type, value, file) \ + type struct_obj##type; \ + cJSON *json_obj##type = struct_to_json_##type(&struct_obj##type); \ + char* str_json##type = cJSON_Print(json_obj##type); \ + printf("s2j:\n%s: %s\n",#type, str_json##type); \ + fprintf(file,",\n\t\t{\n\t\t\t\"type\": \"%s\",\n\t\t\t\"value\": %s\n\t\t}", #type, str_json##type); \ + cJSON *json_obj1##type =cJSON_Parse(str_json##type); \ + cJSON_bool json_cmp1##type = cJSON_Compare(json_obj ##type, json_obj1##type, 1); \ + printf("%s:json_cmp1:%d\n\n\n",#type, json_cmp1##type); \ + type *p_struct_obj##type =(type *)json_to_struct_##type(json_obj1##type); \ + cJSON *json_obj2##type = struct_to_json_##type(p_struct_obj##type); \ + char* str_json2##type = cJSON_Print(json_obj2##type); \ + printf("s2j2s2j:\n%s: %s\n",#type, str_json2##type); \ + int str_cmp##type = strcmp(str_json##type, str_json2##type); \ + printf("\n%s:strcmp:%d\n",#type, str_cmp##type); \ + cJSON_bool json_cmp2##type = cJSON_Compare(json_obj##type, json_obj2##type, 1); \ + printf("%s:json_cmp2:%d\n\n\n",#type, json_cmp2##type); \ + free(str_json##type); \ + free(str_json2##type); \ + s2j_delete_struct_obj(p_struct_obj##type); \ + s2j_delete_json_obj(json_obj##type); \ + s2j_delete_json_obj(json_obj1##type); \ + s2j_delete_json_obj(json_obj2##type); \ + #define TEST_S2J_STRUCT(type, value, file) \ type struct_obj##type; \ memset(&struct_obj##type, value, sizeof(type)); \ diff --git a/demo/struct_defination.json b/demo/struct_defination.json index 7f345f3..38798f6 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -1,140 +1,86 @@ { - "struct": [ - { - "type": "void*", - "value": null - }, - { - "type": "McUsrInfoT", - "value": { - "pInt": 0, - "pIntArray": [ - 0, - 0 - ], - "fun": 0, - "funArray": [ - 0, - 0 - ], - "day1": 0, - "day2": 0, - "day2Array": [ - 0, - 0 - ], - "id": 0, - "idArray": [ - 0, - 0 - ], - "usrType": 0, - "usrName": "", - "usrNameArray": [ - "", - "" - ], - "usrSqno": 0, - "ussSqnoArray": [ - 0, - 0 - ], - "jobSqno": 0, - "jobSqnoArray": [ - 0, - 0 - ], - "rate": 0, - "rateArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - } - }, - { - "type": "McBaseOrdrT", - "value": { - "taskSqno": 0, - "taskSqnoArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - } - }, - { - "type": "McBaseOrdrArrayT", - "value": { - "mcBaseOrdrArray": [ - { - "taskSqno": 0, - "taskSqnoArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - }, - { - "taskSqno": 0, - "taskSqnoArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - } - ] - } - }, - { - "type": "McOcoBaseOrdrT", - "value": { - "mcBaseOrdrAry": { - "mcBaseOrdrArray": [ - { - "taskSqno": 0, - "taskSqnoArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - }, - { - "taskSqno": 0, - "taskSqnoArray": [ - 0, - 0 - ], - "price": 0, - "priceArray": [ - 0, - 0 - ] - } - ] - }, - "pUsrDef": 0 - } - } - ] + "struct": [ + { + "type": "void*", + "value": null + }, + { + "type": "CppStructInfoT", + "value": { + "string1": "", + "stringArray2": ["", ""], + "b1": 0, + "bArray2": [0, 0] +} + }, + { + "type": "McUsrInfoT", + "value": { + "pInt": -72057594037927936, + "pIntArray": [0, 0], + "fun": 0, + "funArray": [0, 0], + "day1": 0, + "day2": 0, + "day2Array": [0, 0], + "id": 0, + "idArray": [0, 0], + "usrType": 0, + "usrName": "", + "usrNameArray": ["", ""], + "usrSqno": 0, + "ussSqnoArray": [791621423, 791621423], + "jobSqno": 3399988123389603631, + "jobSqnoArray": [0, 0], + "rate": 0, + "rateArray": [-1.7014118346046923e+38, 0], + "price": 0, + "priceArray": [0, 0] +} + }, + { + "type": "McBaseOrdrT", + "value": { + "taskSqno": 1, + "taskSqnoArray": [0, 0], + "price": 6.9033239835166e-310, + "priceArray": [6.95325407741737e-310, 6.90332460284261e-310] +} + }, + { + "type": "McBaseOrdrArrayT", + "value": { + "mcBaseOrdrArray": [{ + "taskSqno": 28, + "taskSqnoArray": [0, 0], + "price": 2.09067237684115e-317, + "priceArray": [6.95325407742013e-310, 4.94065645841247e-324] + }, { + "taskSqno": 24845, + "taskSqnoArray": [64, 0], + "price": 2.09072771219349e-317, + "priceArray": [6.90332460148482e-310, 0] + }] +} + }, + { + "type": "McOcoBaseOrdrT", + "value": { + "mcBaseOrdrAry": { + "mcBaseOrdrArray": [{ + "taskSqno": 0, + "taskSqnoArray": [0, 0], + "price": 0, + "priceArray": [0, 1.3906499416489327e-309] + }, { + "taskSqno": 0, + "taskSqnoArray": [0, 0], + "price": 0, + "priceArray": [2.0546950501119882e-81, 2.0546950501119882e-81] + }] + }, + "pUsrDef": 0 +} + } + ] } \ No newline at end of file diff --git a/demo/struct_defination.txt b/demo/struct_defination.txt index ac080e7..29d9f61 100644 --- a/demo/struct_defination.txt +++ b/demo/struct_defination.txt @@ -1,4 +1,12 @@ +typedef struct CppStructInfoS +{ + std::string string1; + std::string stringArray2[2]; + bool b1; + bool bArray2[2]; +} CppStructInfoT, *pCppStructInfoT; + typedef struct McUsrInfoS { int *pInt; diff --git a/demo/tests2j b/demo/tests2j index ba710c60f80ec0c4d67be4b2379097dbfe886f56..ab323836a5a15baeb6a595c65ebe8196dea5da6c 100644 GIT binary patch literal 123376 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 literal 89040 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
    =CMJQ50BM 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 diff --git a/struct2json/inc/s2jdef.h b/struct2json/inc/s2jdef.h index 63b6e93..a6b9da5 100644 --- a/struct2json/inc/s2jdef.h +++ b/struct2json/inc/s2jdef.h @@ -32,6 +32,10 @@ #include "cJSON.h" #include +#ifdef __cplusplus +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -63,6 +67,12 @@ typedef struct { json_temp = cJSON_GetObjectItem(from_json, #_element); \ if (json_temp) strncpy((to_struct)->_element, json_temp->valuestring,sizeof((to_struct)->_element)-1); +#ifdef __cplusplus +#define S2J_STRUCT_GET_stdstring_ELEMENT(to_struct, from_json, _element) \ + json_temp = cJSON_GetObjectItem(from_json, #_element); \ + if (json_temp) (to_struct)->_element.assign(json_temp->valuestring); +#endif + #define S2J_STRUCT_GET_string_ELEMENT_EX(to_struct, from_json, _element, _defval) \ { \ if (from_json) { \ @@ -74,6 +84,19 @@ typedef struct { } \ } +#ifdef __cplusplus +#define S2J_STRUCT_GET_stdstring_ELEMENT_EX(to_struct, from_json, _element, _defval) \ + { \ + if (from_json) { \ + json_temp = cJSON_GetObjectItem(from_json, #_element); \ + if (json_temp) (to_struct)->_element = json_temp->valuestring; \ + else (to_struct)->_element.assign(1, _defval); \ + } else { \ + (to_struct)->_element.assign(1, _defval); \ + } \ + } +#endif + #define S2J_STRUCT_GET_double_ELEMENT(to_struct, from_json, _element) \ json_temp = cJSON_GetObjectItem(from_json, #_element); \ if (json_temp) (to_struct)->_element = json_temp->valuedouble; @@ -95,6 +118,11 @@ typedef struct { #define S2J_STRUCT_ARRAY_GET_string_ELEMENT(to_struct, from_json, _element, index) \ strncpy((to_struct)->_element[index], from_json->valuestring,sizeof((to_struct)->_element[0])-1); +#ifdef __cplusplus +#define S2J_STRUCT_ARRAY_GET_stdstring_ELEMENT(to_struct, from_json, _element, index) \ + (to_struct)->_element[index] = from_json->valuestring; +#endif + #define S2J_STRUCT_ARRAY_GET_double_ELEMENT(to_struct, from_json, _element, index) \ (to_struct)->_element[index] = from_json->valuedouble; @@ -109,6 +137,12 @@ typedef struct { if (from_json) strncpy((to_struct)->_element[index], from_json->valuestring,sizeof((to_struct)->_element[0])-1); \ else strncpy((to_struct)->_element[index], _defval,sizeof((to_struct)->_element[0])-1); +#ifdef __cplusplus +#define S2J_STRUCT_ARRAY_GET_stdstring_ELEMENT_EX(to_struct, from_json, _element, index, _defval) \ + if (from_json) (to_struct)->_element[index] = from_json->valuestring; \ + else (to_struct)->_element[index].assign(1, _defval); +#endif + #define S2J_STRUCT_ARRAY_GET_double_ELEMENT_EX(to_struct, from_json, _element, index, _defval) \ if (from_json) (to_struct)->_element[index] = from_json->valuedouble; \ else (to_struct)->_element[index] = _defval; @@ -126,6 +160,11 @@ typedef struct { (from_struct)->_element[sizeof((from_struct)->_element)-1] = '\0'; \ cJSON_AddStringToObject(to_json, #_element, (from_struct)->_element); +#ifdef __cplusplus +#define S2J_JSON_SET_stdstring_ELEMENT(to_json, from_struct, _element) \ + cJSON_AddStringToObject(to_json, #_element, (from_struct)->_element.c_str()); +#endif + #define S2J_JSON_ARRAY_SET_int_ELEMENT(to_json, from_struct, _element, index) \ cJSON_AddItemToArray(to_json, cJSON_CreateInt((from_struct)->_element[index])); @@ -136,6 +175,11 @@ typedef struct { (from_struct)->_element[index][sizeof((from_struct)->_element[0])-1] = '\0'; \ cJSON_AddItemToArray(to_json, cJSON_CreateString((from_struct)->_element[index])); +#ifdef __cplusplus +#define S2J_JSON_ARRAY_SET_stdstring_ELEMENT(to_json, from_struct, _element, index) \ + cJSON_AddItemToArray(to_json, cJSON_CreateString((from_struct)->_element[index].c_str())); +#endif + #define S2J_JSON_ARRAY_SET_ELEMENT(to_json, from_struct, type, _element, index) \ S2J_JSON_ARRAY_SET_##type##_ELEMENT(to_json, from_struct, _element, index) @@ -167,13 +211,24 @@ typedef struct { cJSON *child_json = cJSON_CreateObject(); \ if (child_json) cJSON_AddItemToObject(to_json, #_element, child_json); +#ifdef __cplusplus +#define S2J_CREATE_STRUCT_OBJECT(struct_obj, type) \ + cJSON *json_temp; \ + type *struct_obj = (type *) new type; +#else #define S2J_CREATE_STRUCT_OBJECT(struct_obj, type) \ cJSON *json_temp; \ type *struct_obj = (type *)s2jHook.malloc_fn(sizeof(type)); \ if (struct_obj) memset(struct_obj, 0, sizeof(type)); +#endif +#ifdef __cplusplus +#define S2J_DELETE_STRUCT_OBJECT(struct_obj) \ + delete struct_obj; +#else #define S2J_DELETE_STRUCT_OBJECT(struct_obj) \ s2jHook.free_fn(struct_obj); +#endif #define S2J_STRUCT_GET_BASIC_ELEMENT(to_struct, from_json, type, _element) \ S2J_STRUCT_GET_##type##_ELEMENT(to_struct, from_json, _element) From 568483ca4f401b2f73c8250cd16ff3b94b9ad578 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 11:34:06 +0800 Subject: [PATCH 02/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index efcef7b..158f9e0 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ typedef struct { V2.1+: g++ ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -fpermissive -lm -g -DDEBUGS2J -o tests2j 测试 ./tests2j 查看output输出和生成的JSON样例文件struct_defination.json; - 预期输出:*:strcmp:0 *:strcmp:0 *:json_cmp:1 + 预期输出:*:strcmp:0 *:strcmp:0 *:json_cmp:1 欢迎大家 **fork and pull request**([Github](https://github.com/armink/struct2json)|[OSChina](http://git.oschina.net/armink/struct2json)|[Coding](https://coding.net/u/armink/p/struct2json/git)) 。如果觉得这个开源项目很赞,可以点击[项目主页](https://github.com/armink/struct2json) 右上角的**Star**,同时把它推荐给更多有需要的朋友。 From 0754fb3505711f702128ab50c295a1faa773ad2b Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 11:40:50 +0800 Subject: [PATCH 03/13] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 158f9e0..89e61e1 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -# C结构体与 JSON 快速互转库 +# C&C++结构体与 JSON 快速互转库 --- ## struct2json -[struct2json](https://github.com/armink/struct2json) 是一个开源的C结构体与 JSON 快速互转库,它可以快速实现 **结构体对象** 与 **JSON 对象** 之间序列化及反序列化要求。快速、简洁的 API 设计,大大降低直接使用 JSON 解析库来实现此类功能的代码复杂度。 +[struct2json](https://github.com/armink/struct2json) 是一个开源的C&C++结构体与 JSON 快速互转库,它可以快速实现 **结构体对象** 与 **JSON 对象** 之间序列化及反序列化要求。快速、简洁的 API 设计,大大降低直接使用 JSON 解析库来实现此类功能的代码复杂度。 ## 起源 -把面向对象设计应用到C语言中,是当下很流行的设计思想。由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象。有了对象之后,很多时候需要考虑对象的序列化及反序列化问题。C语言不像很多高级语言拥有反射等机制,使得对象序列化及反序列化被原生的支持。 +把面向对象设计应用到C语言中,是当下很流行的设计思想。由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象。有了对象之后,很多时候需要考虑对象的序列化及反序列化问题。 +C&C++语言不像很多高级语言拥有反射等机制,使得对象序列化及反序列化被原生的支持。 +对于C&C++语言来说,序列化为 JSON 字符串是个不错的选择,所以就得使用 [cJSON](https://github.com/kbranigan/cJSON) 这类 JSON 解析库,但是使用后的代码冗余且逻辑性差,所以萌生对cJSON库进行二次封装,实现一个 struct 与 JSON 之间快速互转的库。 struct2json 就诞生于此。下面是 struct2json 主要使用场景: -对于C语言来说,序列化为 JSON 字符串是个不错的选择,所以就得使用 [cJSON](https://github.com/kbranigan/cJSON) 这类 JSON 解析库,但是使用后的代码冗余且逻辑性差,所以萌生对cJSON库进行二次封装,实现一个 struct 与 JSON 之间快速互转的库。 struct2json 就诞生于此。下面是 struct2json 主要使用场景: - -- **持久化** :结构体对象序列化为 JSON 对象后,可直接保存至文件、Flash,实现对结构体对象的掉电存储; -- **通信** :高级语言对JSON支持的很友好,例如: Javascript、Groovy 就对 JSON 具有原生的支持,所以 JSON 也可作为C语言与其他语言软件之间的通信协议格式及对象传递格式; +- **持久化** :结构体对象序列化为 JSON 对象后,可直接保存至文件、Flash,实现对结构体对象的持久化存储; +- **通信** :高级语言对JSON支持的很友好,例如: Javascript、Groovy 就对 JSON 具有原生的支持,所以 JSON 也可作为C&C++语言与其他语言软件之间的通信协议格式及对象传递格式; - **可视化** :序列化为 JSON 后的对象,可以更加直观的展示到控制台或者 UI 上,可用于产品调试、产品二次开发等场景; ## 如何使用 @@ -50,12 +50,12 @@ typedef struct { |:-----:|:-----:| |![JSON转结构体-使用前](https://git.oschina.net/Armink/struct2json/raw/master/docs/zh/images/not_use_struct2json_for_json.png)| ![JSON转结构体-使用后](https://git.oschina.net/Armink/struct2json/raw/master/docs/zh/images/used_struct2json_for_json.png)| -### V2.0版本新增功能【yuxuebao】 +### V2.0版本新增功能【yuxuebao@msn.com】 #### 1) 更新cJSON库至1.7.12版本,并扩充实现,支持int64 (long long)类型数据。PS:cJSON原来int64类型以double方式处理,如果超过16位会有精度损失。 #### 2) 扩展struct2json功能,增加支持结构体内包含结构体成员,支持包含数组成员。 #### 3) 增加struct2json 结构体与JSON转换代码自动生成的Python脚本,支持从头文件中提取结构体定义,并根据结构体定义自动生成结构体与JSON互转代码,并提供相关示例。 -### V2.1版本新增功能【yuxuebao】 +### V2.1版本新增功能【yuxuebao@msn.com】 #### 1) 扩展struct2json功能,增加支持C++结构体,支持string,bool类型成员和数组。 From 48eeff2fd0f7b78f3cb271c5b24f221f10403767 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 12:31:20 +0800 Subject: [PATCH 04/13] Update s2jdef.h --- struct2json/inc/s2jdef.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/struct2json/inc/s2jdef.h b/struct2json/inc/s2jdef.h index a6b9da5..9d8bd26 100644 --- a/struct2json/inc/s2jdef.h +++ b/struct2json/inc/s2jdef.h @@ -89,7 +89,7 @@ typedef struct { { \ if (from_json) { \ json_temp = cJSON_GetObjectItem(from_json, #_element); \ - if (json_temp) (to_struct)->_element = json_temp->valuestring; \ + if (json_temp) (to_struct)->_element.assign( json_temp->valuestring); \ else (to_struct)->_element.assign(1, _defval); \ } else { \ (to_struct)->_element.assign(1, _defval); \ @@ -120,7 +120,7 @@ typedef struct { #ifdef __cplusplus #define S2J_STRUCT_ARRAY_GET_stdstring_ELEMENT(to_struct, from_json, _element, index) \ - (to_struct)->_element[index] = from_json->valuestring; + (to_struct)->_element[index].assign( from_json->valuestring); #endif #define S2J_STRUCT_ARRAY_GET_double_ELEMENT(to_struct, from_json, _element, index) \ @@ -139,7 +139,7 @@ typedef struct { #ifdef __cplusplus #define S2J_STRUCT_ARRAY_GET_stdstring_ELEMENT_EX(to_struct, from_json, _element, index, _defval) \ - if (from_json) (to_struct)->_element[index] = from_json->valuestring; \ + if (from_json) (to_struct)->_element[index].assign( from_json->valuestring); \ else (to_struct)->_element[index].assign(1, _defval); #endif From a9a0f55f1f00d723bdd07960bc171fb3fa69b6ca Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 12:37:42 +0800 Subject: [PATCH 05/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89e61e1..949fcc1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## 起源 -把面向对象设计应用到C语言中,是当下很流行的设计思想。由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象。有了对象之后,很多时候需要考虑对象的序列化及反序列化问题。 +很多时候需要C&C++对象的序列化及反序列化问题(由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象)。 C&C++语言不像很多高级语言拥有反射等机制,使得对象序列化及反序列化被原生的支持。 对于C&C++语言来说,序列化为 JSON 字符串是个不错的选择,所以就得使用 [cJSON](https://github.com/kbranigan/cJSON) 这类 JSON 解析库,但是使用后的代码冗余且逻辑性差,所以萌生对cJSON库进行二次封装,实现一个 struct 与 JSON 之间快速互转的库。 struct2json 就诞生于此。下面是 struct2json 主要使用场景: From fb0769aed4115934f01f14bfc7b523ebbcd157e9 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 12:40:37 +0800 Subject: [PATCH 06/13] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 949fcc1..1201643 100644 --- a/README.md +++ b/README.md @@ -51,14 +51,13 @@ typedef struct { |![JSON转结构体-使用前](https://git.oschina.net/Armink/struct2json/raw/master/docs/zh/images/not_use_struct2json_for_json.png)| ![JSON转结构体-使用后](https://git.oschina.net/Armink/struct2json/raw/master/docs/zh/images/used_struct2json_for_json.png)| ### V2.0版本新增功能【yuxuebao@msn.com】 -#### 1) 更新cJSON库至1.7.12版本,并扩充实现,支持int64 (long long)类型数据。PS:cJSON原来int64类型以double方式处理,如果超过16位会有精度损失。 +#### 1) 更新cJSON库至1.7.14版本,并扩充实现,支持int64 (long long)类型数据。PS:cJSON原来int64类型以double方式处理,如果超过16位会有精度损失。 #### 2) 扩展struct2json功能,增加支持结构体内包含结构体成员,支持包含数组成员。 #### 3) 增加struct2json 结构体与JSON转换代码自动生成的Python脚本,支持从头文件中提取结构体定义,并根据结构体定义自动生成结构体与JSON互转代码,并提供相关示例。 ### V2.1版本新增功能【yuxuebao@msn.com】 #### 1) 扩展struct2json功能,增加支持C++结构体,支持string,bool类型成员和数组。 - ### V2.x 使用说明: #### 1) 提取结构体定义: 将头文件(eg:mc_usr_def.h)放在demo\inc目录下; From 1e09d959d2b51d13d71ddb8c18cdf3c094f013c2 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 14:02:02 +0800 Subject: [PATCH 07/13] Compatible with C and C + + code --- demo/main.c | 5 ++++ demo/my_struct_2_json.c | 20 ++++++++++----- demo/my_struct_2_json.h | 7 ++--- demo/struct_defination.json | 50 ++++++++++++++++++------------------ demo/tests2j | Bin 123376 -> 123312 bytes 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/demo/main.c b/demo/main.c index d770260..40968b8 100644 --- a/demo/main.c +++ b/demo/main.c @@ -31,10 +31,15 @@ #include #ifdef DEBUGS2J +#ifdef __cplusplus extern "C" { extern int s2j_test(void); extern int s2j_test2(void); } +#else +extern int s2j_test(void); +extern int s2j_test2(void); +#endif #endif// DEBUGS2J #ifndef DEBUGS2J diff --git a/demo/my_struct_2_json.c b/demo/my_struct_2_json.c index 8eee7dd..c811a64 100644 --- a/demo/my_struct_2_json.c +++ b/demo/my_struct_2_json.c @@ -5,7 +5,8 @@ #ifdef __cplusplus extern "C" { #endif - + +#ifdef __cplusplus #if 0 typedef struct CppStructInfoS { @@ -35,6 +36,7 @@ void *json_to_struct_CppStructInfoT(cJSON* json_obj) s2j_struct_get_array_element(struct_obj_,json_obj, int, bArray2); return struct_obj_; } +#endif #if 0 typedef struct McUsrInfoS @@ -189,8 +191,8 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) return struct_obj_; } - -#ifdef DEBUGS2J + +#ifdef DEBUGS2J int s2j_test(void) { @@ -208,14 +210,16 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) fp = fopen(file_name, "w"); if (NULL == fp) return 1; - fprintf(fp,"{\n\t\"struct\": [\n\t\t{\n\t\t\t\"type\": \"void*\",\n\t\t\t\"value\": null\n\t\t}"); + fprintf(fp,"{\n\t\"struct\": [\n\t\t{\n\t\t\t\"type\": \"void*\",\n\t\t\t\"value\": null\n\t\t}"); +#ifdef __cplusplus TEST_S2J_STRUCT_CPP(CppStructInfoT, 0 , fp); +#endif TEST_S2J_STRUCT_CPP(McUsrInfoT, 0 , fp); TEST_S2J_STRUCT_CPP(McBaseOrdrT, 0 , fp); TEST_S2J_STRUCT_CPP(McBaseOrdrArrayT, 0 , fp); TEST_S2J_STRUCT_CPP(McOcoBaseOrdrT, 0 , fp); - + fprintf(fp,"\n\t]\n}"); fclose(fp); return 0; @@ -255,12 +259,14 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) printf("\nsize:\n%d\n",array_size); int i = 0; \ +#ifdef __cplusplus TEST_S2J_JSON(CppStructInfoT, array_size); +#endif TEST_S2J_JSON(McUsrInfoT, array_size); TEST_S2J_JSON(McBaseOrdrT, array_size); TEST_S2J_JSON(McBaseOrdrArrayT, array_size); TEST_S2J_JSON(McOcoBaseOrdrT, array_size); - + fclose(fp); free(p); return 0; @@ -271,4 +277,4 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) #ifdef __cplusplus } -#endif /* end of __cplusplus */ \ No newline at end of file +#endif /* end of __cplusplus */ diff --git a/demo/my_struct_2_json.h b/demo/my_struct_2_json.h index 4a00943..8775c41 100644 --- a/demo/my_struct_2_json.h +++ b/demo/my_struct_2_json.h @@ -2,10 +2,11 @@ extern "C" { #endif +#ifdef __cplusplus cJSON *struct_to_json_CppStructInfoT(void* struct_obj); void *json_to_struct_CppStructInfoT(cJSON* json_obj); - +#endif cJSON *struct_to_json_McUsrInfoT(void* struct_obj); void *json_to_struct_McUsrInfoT(cJSON* json_obj); @@ -21,7 +22,7 @@ void *json_to_struct_McBaseOrdrArrayT(cJSON* json_obj); cJSON *struct_to_json_McOcoBaseOrdrT(void* struct_obj); void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj); - + #ifdef __cplusplus } -#endif /* end of __cplusplus */ \ No newline at end of file +#endif /* end of __cplusplus */ diff --git a/demo/struct_defination.json b/demo/struct_defination.json index 38798f6..2df4324 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -9,15 +9,15 @@ "value": { "string1": "", "stringArray2": ["", ""], - "b1": 0, - "bArray2": [0, 0] + "b1": 238, + "bArray2": [45, 136] } }, { "type": "McUsrInfoT", "value": { - "pInt": -72057594037927936, - "pIntArray": [0, 0], + "pInt": 0, + "pIntArray": [0, -72057594037927936], "fun": 0, "funArray": [0, 0], "day1": 0, @@ -29,12 +29,12 @@ "usrName": "", "usrNameArray": ["", ""], "usrSqno": 0, - "ussSqnoArray": [791621423, 791621423], - "jobSqno": 3399988123389603631, - "jobSqnoArray": [0, 0], + "ussSqnoArray": [0, 1073741824], + "jobSqno": 0, + "jobSqnoArray": [3399988123389603631, 3399988123389603631], "rate": 0, - "rateArray": [-1.7014118346046923e+38, 0], - "price": 0, + "rateArray": [0, 0], + "price": -5.48612406879369e+303, "priceArray": [0, 0] } }, @@ -43,23 +43,23 @@ "value": { "taskSqno": 1, "taskSqnoArray": [0, 0], - "price": 6.9033239835166e-310, - "priceArray": [6.95325407741737e-310, 6.90332460284261e-310] + "price": 0, + "priceArray": [0, 6.94644090879169e-310] } }, { "type": "McBaseOrdrArrayT", "value": { "mcBaseOrdrArray": [{ - "taskSqno": 28, - "taskSqnoArray": [0, 0], - "price": 2.09067237684115e-317, - "priceArray": [6.95325407742013e-310, 4.94065645841247e-324] + "taskSqno": 6336, + "taskSqnoArray": [-5299, 32766], + "price": 6.9464415281177e-310, + "priceArray": [1.38338380835549e-322, 2.09064075663982e-317] }, { - "taskSqno": 24845, - "taskSqnoArray": [64, 0], - "price": 2.09072771219349e-317, - "priceArray": [6.90332460148482e-310, 0] + "taskSqno": 6392, + "taskSqnoArray": [-5299, 32766], + "price": 4.94065645841247e-324, + "priceArray": [2.08450495538412e-317, 2.09069609199215e-317] }] } }, @@ -68,18 +68,18 @@ "value": { "mcBaseOrdrAry": { "mcBaseOrdrArray": [{ - "taskSqno": 0, - "taskSqnoArray": [0, 0], + "taskSqno": 16016, + "taskSqnoArray": [27272, 32735], "price": 0, - "priceArray": [0, 1.3906499416489327e-309] + "priceArray": [0, 0] }, { "taskSqno": 0, "taskSqnoArray": [0, 0], - "price": 0, - "priceArray": [2.0546950501119882e-81, 2.0546950501119882e-81] + "price": 1.3906499416489327e-309, + "priceArray": [0, 0] }] }, - "pUsrDef": 0 + "pUsrDef": 3399988123389603631 } } ] diff --git a/demo/tests2j b/demo/tests2j index ab323836a5a15baeb6a595c65ebe8196dea5da6c..d1799a6bd7f4eb0530cdcebd5d0c827a39873d49 100644 GIT binary patch delta 16844 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%0D{RZ2B!dGW;i(F_qatJ(wSsDSq}d1_~H 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 delta 16891 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 From fad54ad40ca98eafab773d958897899df8a5cbb9 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 14:14:47 +0800 Subject: [PATCH 08/13] Compatible with C and C + + code --- demo/main.c | 4 ++-- demo/struct_defination.json | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/demo/main.c b/demo/main.c index 40968b8..ad28c40 100644 --- a/demo/main.c +++ b/demo/main.c @@ -42,7 +42,7 @@ extern int s2j_test2(void); #endif #endif// DEBUGS2J -#ifndef DEBUGS2J +#ifndef __cplusplus typedef struct { char name[16]; } Hometown; @@ -115,7 +115,7 @@ static cJSON *struct_to_json(void* struct_obj) { #endif int main(void) { -#ifndef DEBUGS2J +#ifndef __cplusplus static Student orignal_student_obj = { .id = 24, .weight = 71.2, diff --git a/demo/struct_defination.json b/demo/struct_defination.json index 2df4324..3a8cfdd 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -10,7 +10,7 @@ "string1": "", "stringArray2": ["", ""], "b1": 238, - "bArray2": [45, 136] + "bArray2": [93, 174] } }, { @@ -44,20 +44,20 @@ "taskSqno": 1, "taskSqnoArray": [0, 0], "price": 0, - "priceArray": [0, 6.94644090879169e-310] + "priceArray": [0, 6.9268556744124e-310] } }, { "type": "McBaseOrdrArrayT", "value": { "mcBaseOrdrArray": [{ - "taskSqno": 6336, - "taskSqnoArray": [-5299, 32766], - "price": 6.9464415281177e-310, + "taskSqno": 28480, + "taskSqnoArray": [-534, 32767], + "price": 6.92685629373841e-310, "priceArray": [1.38338380835549e-322, 2.09064075663982e-317] }, { - "taskSqno": 6392, - "taskSqnoArray": [-5299, 32766], + "taskSqno": 28536, + "taskSqnoArray": [-534, 32767], "price": 4.94065645841247e-324, "priceArray": [2.08450495538412e-317, 2.09069609199215e-317] }] @@ -68,8 +68,8 @@ "value": { "mcBaseOrdrAry": { "mcBaseOrdrArray": [{ - "taskSqno": 16016, - "taskSqnoArray": [27272, 32735], + "taskSqno": 28304, + "taskSqnoArray": [7854, 32643], "price": 0, "priceArray": [0, 0] }, { From c3f1f5df7f8b249e688238e2e44e7bdb196c15af Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 14:21:15 +0800 Subject: [PATCH 09/13] update version to 2.1.0 --- demo/struct_defination.json | 58 ++++++++++++++++++------------------- struct2json/inc/s2j.h | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/demo/struct_defination.json b/demo/struct_defination.json index 3a8cfdd..a11545b 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -9,57 +9,57 @@ "value": { "string1": "", "stringArray2": ["", ""], - "b1": 238, - "bArray2": [93, 174] + "b1": 234, + "bArray2": [249, 222] } }, { "type": "McUsrInfoT", "value": { - "pInt": 0, - "pIntArray": [0, -72057594037927936], + "pInt": 3399988123389603631, + "pIntArray": [3399988123389603631, 0], "fun": 0, - "funArray": [0, 0], + "funArray": [-72057594037927936, 0], "day1": 0, - "day2": 0, + "day2": 1073741824, "day2Array": [0, 0], - "id": 0, - "idArray": [0, 0], - "usrType": 0, - "usrName": "", - "usrNameArray": ["", ""], + "id": 47, + "idArray": [47, 47], + "usrType": 47, + "usrName": "///////", + "usrNameArray": ["////", ""], "usrSqno": 0, - "ussSqnoArray": [0, 1073741824], + "ussSqnoArray": [0, -16777216], "jobSqno": 0, - "jobSqnoArray": [3399988123389603631, 3399988123389603631], + "jobSqnoArray": [0, 0], "rate": 0, "rateArray": [0, 0], - "price": -5.48612406879369e+303, + "price": 0, "priceArray": [0, 0] } }, { "type": "McBaseOrdrT", "value": { - "taskSqno": 1, + "taskSqno": 28, "taskSqnoArray": [0, 0], - "price": 0, - "priceArray": [0, 6.9268556744124e-310] + "price": 2.09064075663982e-317, + "priceArray": [6.95329255343921e-310, 4.94065645841247e-324] } }, { "type": "McBaseOrdrArrayT", "value": { "mcBaseOrdrArray": [{ - "taskSqno": 28480, - "taskSqnoArray": [-534, 32767], - "price": 6.92685629373841e-310, - "priceArray": [1.38338380835549e-322, 2.09064075663982e-317] + "taskSqno": 24781, + "taskSqnoArray": [64, 0], + "price": 2.09069609199215e-317, + "priceArray": [6.90987550844961e-310, 0] }, { - "taskSqno": 28536, - "taskSqnoArray": [-534, 32767], - "price": 4.94065645841247e-324, - "priceArray": [2.08450495538412e-317, 2.09069609199215e-317] + "taskSqno": 0, + "taskSqnoArray": [0, 0], + "price": 0, + "priceArray": [0, 1.3906499416489327e-309] }] } }, @@ -68,18 +68,18 @@ "value": { "mcBaseOrdrAry": { "mcBaseOrdrArray": [{ - "taskSqno": 28304, - "taskSqnoArray": [7854, 32643], + "taskSqno": 0, + "taskSqnoArray": [0, 0], "price": 0, "priceArray": [0, 0] }, { "taskSqno": 0, "taskSqnoArray": [0, 0], - "price": 1.3906499416489327e-309, + "price": 0, "priceArray": [0, 0] }] }, - "pUsrDef": 3399988123389603631 + "pUsrDef": 0 } } ] diff --git a/struct2json/inc/s2j.h b/struct2json/inc/s2j.h index c08f0e3..a044a54 100644 --- a/struct2json/inc/s2j.h +++ b/struct2json/inc/s2j.h @@ -38,7 +38,7 @@ extern "C" { #endif /* struct2json software version number */ -#define S2J_SW_VERSION "2.0.4" +#define S2J_SW_VERSION "2.1.0" /* Create JSON object */ From 45312373a5b1f212a1da9dd95f46eb6e28e9d746 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 14:38:27 +0800 Subject: [PATCH 10/13] Compatible with C and C + + code --- demo/generate_s2j_code.py | 2 +- demo/my_struct_2_json.c | 10 +++---- demo/my_struct_2_json.inc | 12 ++++----- demo/struct_defination.json | 54 ++++++++++++++++++------------------- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/demo/generate_s2j_code.py b/demo/generate_s2j_code.py index dfa03f1..767bf61 100644 --- a/demo/generate_s2j_code.py +++ b/demo/generate_s2j_code.py @@ -244,7 +244,7 @@ str_return = "" str_s2j_test = "" for i in range(len(struct_name_return.split())): - str_s2j_test = str_s2j_test + " TEST_S2J_STRUCT_CPP(" + struct_name_return.split()[i] + ", 0 , fp);\n" + str_s2j_test = str_s2j_test + " TEST_S2J_STRUCT(" + struct_name_return.split()[i] + ", 0 , fp);\n" #print(str_s2j_test) str_s2j_test_tail = r""" diff --git a/demo/my_struct_2_json.c b/demo/my_struct_2_json.c index c811a64..413e84f 100644 --- a/demo/my_struct_2_json.c +++ b/demo/my_struct_2_json.c @@ -213,12 +213,12 @@ void *json_to_struct_McOcoBaseOrdrT(cJSON* json_obj) fprintf(fp,"{\n\t\"struct\": [\n\t\t{\n\t\t\t\"type\": \"void*\",\n\t\t\t\"value\": null\n\t\t}"); #ifdef __cplusplus - TEST_S2J_STRUCT_CPP(CppStructInfoT, 0 , fp); + TEST_S2J_STRUCT(CppStructInfoT, 0 , fp); #endif - TEST_S2J_STRUCT_CPP(McUsrInfoT, 0 , fp); - TEST_S2J_STRUCT_CPP(McBaseOrdrT, 0 , fp); - TEST_S2J_STRUCT_CPP(McBaseOrdrArrayT, 0 , fp); - TEST_S2J_STRUCT_CPP(McOcoBaseOrdrT, 0 , fp); + TEST_S2J_STRUCT(McUsrInfoT, 0 , fp); + TEST_S2J_STRUCT(McBaseOrdrT, 0 , fp); + TEST_S2J_STRUCT(McBaseOrdrArrayT, 0 , fp); + TEST_S2J_STRUCT(McOcoBaseOrdrT, 0 , fp); fprintf(fp,"\n\t]\n}"); fclose(fp); diff --git a/demo/my_struct_2_json.inc b/demo/my_struct_2_json.inc index bc0b8ee..e388eda 100644 --- a/demo/my_struct_2_json.inc +++ b/demo/my_struct_2_json.inc @@ -66,8 +66,8 @@ do\ #ifdef DEBUGS2J - -#define TEST_S2J_STRUCT_CPP(type, value, file) \ +#ifdef __cplusplus +#define TEST_S2J_STRUCT(type, value, file) \ type struct_obj##type; \ cJSON *json_obj##type = struct_to_json_##type(&struct_obj##type); \ char* str_json##type = cJSON_Print(json_obj##type); \ @@ -89,8 +89,8 @@ do\ s2j_delete_struct_obj(p_struct_obj##type); \ s2j_delete_json_obj(json_obj##type); \ s2j_delete_json_obj(json_obj1##type); \ - s2j_delete_json_obj(json_obj2##type); \ - + s2j_delete_json_obj(json_obj2##type); +#else #define TEST_S2J_STRUCT(type, value, file) \ type struct_obj##type; \ memset(&struct_obj##type, value, sizeof(type)); \ @@ -116,8 +116,8 @@ do\ s2j_delete_struct_obj(p_struct_obj##type); \ s2j_delete_json_obj(json_obj##type); \ s2j_delete_json_obj(json_obj1##type); \ - s2j_delete_json_obj(json_obj2##type); \ - + s2j_delete_json_obj(json_obj2##type); +#endif #define TEST_S2J_JSON(type, size) \ cJSON *json_struct_##type = NULL; \ diff --git a/demo/struct_defination.json b/demo/struct_defination.json index a11545b..9b60097 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -9,29 +9,29 @@ "value": { "string1": "", "stringArray2": ["", ""], - "b1": 234, - "bArray2": [249, 222] + "b1": 232, + "bArray2": [243, 236] } }, { "type": "McUsrInfoT", "value": { - "pInt": 3399988123389603631, - "pIntArray": [3399988123389603631, 0], - "fun": 0, - "funArray": [-72057594037927936, 0], + "pInt": 0, + "pIntArray": [0, 3399988123389603631], + "fun": 3399988123389603631, + "funArray": [0, 0], "day1": 0, - "day2": 1073741824, + "day2": 4278190080, "day2Array": [0, 0], - "id": 47, - "idArray": [47, 47], - "usrType": 47, - "usrName": "///////", - "usrNameArray": ["////", ""], - "usrSqno": 0, - "ussSqnoArray": [0, -16777216], + "id": 0, + "idArray": [0, 0], + "usrType": 0, + "usrName": "", + "usrNameArray": ["", "///////"], + "usrSqno": 791621423, + "ussSqnoArray": [0, 0], "jobSqno": 0, - "jobSqnoArray": [0, 0], + "jobSqnoArray": [-72057594037927936, 0], "rate": 0, "rateArray": [0, 0], "price": 0, @@ -41,25 +41,25 @@ { "type": "McBaseOrdrT", "value": { - "taskSqno": 28, - "taskSqnoArray": [0, 0], - "price": 2.09064075663982e-317, - "priceArray": [6.95329255343921e-310, 4.94065645841247e-324] + "taskSqno": -20256, + "taskSqnoArray": [20961, 32766], + "price": 6.9180798432722e-310, + "priceArray": [1.38338380835549e-322, 2.09064075663982e-317] } }, { "type": "McBaseOrdrArrayT", "value": { "mcBaseOrdrArray": [{ - "taskSqno": 24781, - "taskSqnoArray": [64, 0], - "price": 2.09069609199215e-317, - "priceArray": [6.90987550844961e-310, 0] + "taskSqno": -20200, + "taskSqnoArray": [20961, 32766], + "price": 4.94065645841247e-324, + "priceArray": [2.08450495538412e-317, 2.09069609199215e-317] }, { - "taskSqno": 0, - "taskSqnoArray": [0, 0], + "taskSqno": -12656, + "taskSqnoArray": [-15701, 32601], "price": 0, - "priceArray": [0, 1.3906499416489327e-309] + "priceArray": [0, 0] }] } }, @@ -70,7 +70,7 @@ "mcBaseOrdrArray": [{ "taskSqno": 0, "taskSqnoArray": [0, 0], - "price": 0, + "price": 1.3906499416489327e-309, "priceArray": [0, 0] }, { "taskSqno": 0, From aa475b503a8f21c29dc3ce27e55a17297a4e5455 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 15:02:20 +0800 Subject: [PATCH 11/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1201643..49d35d5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## 起源 -很多时候需要C&C++对象的序列化及反序列化问题(由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象)。 +C&C++对象的序列化及反序列化问题解决方案(由于C语言中没有类,所以一般使用结构体 `struct` 充当类,那么结构体变量就是对象)。 C&C++语言不像很多高级语言拥有反射等机制,使得对象序列化及反序列化被原生的支持。 对于C&C++语言来说,序列化为 JSON 字符串是个不错的选择,所以就得使用 [cJSON](https://github.com/kbranigan/cJSON) 这类 JSON 解析库,但是使用后的代码冗余且逻辑性差,所以萌生对cJSON库进行二次封装,实现一个 struct 与 JSON 之间快速互转的库。 struct2json 就诞生于此。下面是 struct2json 主要使用场景: From 8b9de1a072b19e52bf428d53d7e75c7b4f74cc72 Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 15:18:27 +0800 Subject: [PATCH 12/13] support wchar_t --- demo/generate_s2j_code.py | 2 +- demo/inc/mc_usr_def.h | 2 ++ demo/my_struct_2_json.c | 6 ++++ demo/struct_defination.json | 56 +++++++++++++++++++----------------- demo/struct_defination.txt | 2 ++ demo/tests2j | Bin 123312 -> 123632 bytes 6 files changed, 40 insertions(+), 28 deletions(-) diff --git a/demo/generate_s2j_code.py b/demo/generate_s2j_code.py index 767bf61..edee164 100644 --- a/demo/generate_s2j_code.py +++ b/demo/generate_s2j_code.py @@ -103,7 +103,7 @@ s2j_code_str_concat = s2j_code_str_concat + "s2j_json_set_basic_element(json_obj_, struct_obj_, stdstring, " + para_name + ");\n\t" j2s_code_str_concat = j2s_code_str_concat + "s2j_struct_get_basic_element(struct_obj_,json_obj, stdstring, " + para_name + ");\n\t" else: #基本类型 - if para_type in ("bool","char","unsigned char","signed char","int","unsigned","unsigned int","signed int","short","unsigned short","signed short","long","unsigned long","signed long","long long","unsigned long long","signed long long","BOOL","bool","size_t","uint8_t","uint16_t","uint32_t","uint64_t","int8_t","int16_t","int32_t","int64_t","uint8","uint16","uint32","uint64","int8","int16","int32","int64","uint_fast64_t","__int128_t","__uint128_t","float","double","long double"): + if para_type in ("bool", "wchar_t", "char","unsigned char","signed char","int","unsigned","unsigned int","signed int","short","unsigned short","signed short","long","unsigned long","signed long","long long","unsigned long long","signed long long","BOOL","bool","size_t","uint8_t","uint16_t","uint32_t","uint64_t","int8_t","int16_t","int32_t","int64_t","uint8","uint16","uint32","uint64","int8","int16","int32","int64","uint_fast64_t","__int128_t","__uint128_t","float","double","long double"): if para_type in ("float","double","long double","__int128_t","__uint128_t"): #浮点型、128位整型 if "[" in para_name: #print(para_name) diff --git a/demo/inc/mc_usr_def.h b/demo/inc/mc_usr_def.h index 802fb65..0713484 100644 --- a/demo/inc/mc_usr_def.h +++ b/demo/inc/mc_usr_def.h @@ -23,6 +23,8 @@ typedef struct CppStructInfoS std::string stringArray2[2]; bool b1; bool bArray2[2]; + wchar_t wc1; + wchar_t wcArray[2]; } CppStructInfoT, *pCppStructInfoT; #endif diff --git a/demo/my_struct_2_json.c b/demo/my_struct_2_json.c index 413e84f..2497b0c 100644 --- a/demo/my_struct_2_json.c +++ b/demo/my_struct_2_json.c @@ -14,6 +14,8 @@ typedef struct CppStructInfoS std::string stringArray2[2]; bool b1; bool bArray2[2]; + wchar_t wc1; + wchar_t wcArray[2]; } CppStructInfoT, *pCppStructInfoT; #endif cJSON *struct_to_json_CppStructInfoT(void* struct_obj) @@ -24,6 +26,8 @@ cJSON *struct_to_json_CppStructInfoT(void* struct_obj) s2j_json_set_array_element(json_obj_, struct_obj_, stdstring, stringArray2,2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, b1); s2j_json_set_array_element(json_obj_, struct_obj_, int, bArray2,2); + s2j_json_set_basic_element(json_obj_, struct_obj_, int, wc1); + s2j_json_set_array_element(json_obj_, struct_obj_, int, wcArray,2); return json_obj_; } @@ -34,6 +38,8 @@ void *json_to_struct_CppStructInfoT(cJSON* json_obj) s2j_struct_get_array_element(struct_obj_,json_obj, stdstring, stringArray2); s2j_struct_get_basic_element(struct_obj_,json_obj, int, b1); s2j_struct_get_array_element(struct_obj_,json_obj, int, bArray2); + s2j_struct_get_basic_element(struct_obj_,json_obj, int, wc1); + s2j_struct_get_array_element(struct_obj_,json_obj, int, wcArray); return struct_obj_; } #endif diff --git a/demo/struct_defination.json b/demo/struct_defination.json index 9b60097..cf51550 100644 --- a/demo/struct_defination.json +++ b/demo/struct_defination.json @@ -9,29 +9,31 @@ "value": { "string1": "", "stringArray2": ["", ""], - "b1": 232, - "bArray2": [243, 236] + "b1": 224, + "bArray2": [146, 64], + "wc1": 0, + "wcArray": [607207720, 32765] } }, { "type": "McUsrInfoT", "value": { - "pInt": 0, - "pIntArray": [0, 3399988123389603631], - "fun": 3399988123389603631, - "funArray": [0, 0], + "pInt": 3399988123389603631, + "pIntArray": [3399988123389603631, 0], + "fun": 0, + "funArray": [-72057594037927936, 0], "day1": 0, - "day2": 4278190080, + "day2": 1073741824, "day2Array": [0, 0], - "id": 0, - "idArray": [0, 0], - "usrType": 0, - "usrName": "", - "usrNameArray": ["", "///////"], - "usrSqno": 791621423, - "ussSqnoArray": [0, 0], + "id": 47, + "idArray": [47, 47], + "usrType": 47, + "usrName": "///////", + "usrNameArray": ["////", ""], + "usrSqno": 0, + "ussSqnoArray": [0, -16777216], "jobSqno": 0, - "jobSqnoArray": [-72057594037927936, 0], + "jobSqnoArray": [0, 0], "rate": 0, "rateArray": [0, 0], "price": 0, @@ -41,25 +43,25 @@ { "type": "McBaseOrdrT", "value": { - "taskSqno": -20256, - "taskSqnoArray": [20961, 32766], - "price": 6.9180798432722e-310, - "priceArray": [1.38338380835549e-322, 2.09064075663982e-317] + "taskSqno": 1, + "taskSqnoArray": [0, 32703], + "price": 0, + "priceArray": [6.93967752719276e-310, 6.93967703304213e-310] } }, { "type": "McBaseOrdrArrayT", "value": { "mcBaseOrdrArray": [{ - "taskSqno": -20200, - "taskSqnoArray": [20961, 32766], - "price": 4.94065645841247e-324, - "priceArray": [2.08450495538412e-317, 2.09069609199215e-317] + "taskSqno": 24781, + "taskSqnoArray": [64, 0], + "price": 2.09089371825049e-317, + "priceArray": [6.93967765101035e-310, 0] }, { - "taskSqno": -12656, - "taskSqnoArray": [-15701, 32601], + "taskSqno": 0, + "taskSqnoArray": [0, 0], "price": 0, - "priceArray": [0, 0] + "priceArray": [0, 1.3906499416489327e-309] }] } }, @@ -70,7 +72,7 @@ "mcBaseOrdrArray": [{ "taskSqno": 0, "taskSqnoArray": [0, 0], - "price": 1.3906499416489327e-309, + "price": 0, "priceArray": [0, 0] }, { "taskSqno": 0, diff --git a/demo/struct_defination.txt b/demo/struct_defination.txt index 29d9f61..3eb9645 100644 --- a/demo/struct_defination.txt +++ b/demo/struct_defination.txt @@ -5,6 +5,8 @@ typedef struct CppStructInfoS std::string stringArray2[2]; bool b1; bool bArray2[2]; + wchar_t wc1; + wchar_t wcArray[2]; } CppStructInfoT, *pCppStructInfoT; typedef struct McUsrInfoS diff --git a/demo/tests2j b/demo/tests2j index d1799a6bd7f4eb0530cdcebd5d0c827a39873d49..ed7e3115736e8cf4909352f6a53e39b5db567216 100644 GIT binary patch delta 23554 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

    #zARVUSD#d;b#mgcD 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 Ri2rz&$8?d_>QmO~{{UB}Y1jY& delta 22559 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 From b7d6170c7201d79158635de530dae2ab1cbbbfec Mon Sep 17 00:00:00 2001 From: yuxuebao Date: Wed, 24 Mar 2021 15:19:09 +0800 Subject: [PATCH 13/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49d35d5..f0d424a 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ typedef struct { #### 3) 增加struct2json 结构体与JSON转换代码自动生成的Python脚本,支持从头文件中提取结构体定义,并根据结构体定义自动生成结构体与JSON互转代码,并提供相关示例。 ### V2.1版本新增功能【yuxuebao@msn.com】 -#### 1) 扩展struct2json功能,增加支持C++结构体,支持string,bool类型成员和数组。 +#### 1) 扩展struct2json功能,增加支持C++结构体,支持string,bool,wchar_t类型成员和数组。 ### V2.x 使用说明: #### 1) 提取结构体定义: