cheliequan
2023-01-13 db57152615104b4634c42946a912200a58bc5f93
1.重构代码,将模板函数分成两个函数
2.增加get_value_by_key函数
2个文件已修改
92 ■■■■ 已修改文件
util.cpp 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util.h 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util.cpp
@@ -234,3 +234,54 @@
    return bRet;
}
/*****************************************************************************
 函 数 名  : get_value_by_key
 功能描述  : 获取json字符串中字段为key值的value,pptr_data内存需要用户申请和释放
 输入参数  : char *json
             const char *key
             char **pptr_data
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :
 修改历史      :
  1.日    期   : 2023年1月13日
    作    者   : cheliequan
    修改内容   : 新生成函数
*****************************************************************************/
int get_value_by_key(char *json, const char *key, char **pptr_data)
{
    size_t data_len = 0;
    // Read JSON and get root
    yyjson_doc *doc = yyjson_read(json, strlen(json), 0);
    yyjson_val *root = yyjson_doc_get_root(doc);
    // Get root[key]
    yyjson_val *val = yyjson_obj_get(root, key);
    char * val_str = (char *)yyjson_get_str(val);
    printf("val: %s\n", val_str);
    if(NULL == val_str)
    {
        yyjson_doc_free(doc);
        return -1;
    }
    char *ptr_value = yyjson_val_write(val, YYJSON_WRITE_NOFLAG, &data_len);
    printf("data: %s\n", ptr_value);
    printf("len: %lu\n", data_len);
    *pptr_data = (char *)malloc(data_len);
    memset(*pptr_data, 0, data_len);
    memcpy(*pptr_data, ptr_value, data_len);
    // Free the doc
    yyjson_doc_free(doc);
    return 0;
}
util.h
@@ -31,36 +31,23 @@
bool bus_dbapi_get_topic_data(void *handle, const char* topic, crepmsg **pptr_repmsg, size_t len);
extern "C" int bus_dbapi_get_json_data(const char * json, char ** pptr_data, uint8_t *ptr_type);
bool bus_dbapi_get_str(void *handle, const char* topic, char **pptr_str);
template <class T>  bool bus_dbapi_get_list (void *handle, const char* topic, T & list)
int get_value_by_key(char *json, const char *key, char **pptr_data);
template <class T>  bool bus_dbapi_get_list (char *json, T & list)
{
    char * ptr_value = NULL;
    size_t data_len = 0;
    //get the topic json data
    yyjson_type type = YYJSON_TYPE_OBJ;
    crepmsg *repmsg = NULL;
    size_t len = 0;
    //T t;
    //typedef decltype(list) vec_type;
    
    using TMPT = typename std::remove_reference<decltype(*list.begin())>::type;
    TMPT t;
    //vec_type::value_type t;
    int ret = 0;
    ret = bus_dbapi_get_topic_data(handle, topic, &repmsg, len);
    if ( ret < 0 || NULL == repmsg)
    {
        return false;
    }
    //parse the json to get value of the key "data"  
    int msglen = strlen(repmsg->data);
    int msglen = strlen(json);
    char* msgdata = (char *)malloc(msglen);
    memset(msgdata, 0 , msglen);
    if(0 == bus_dbapi_get_json_data((const char *)repmsg->data, &msgdata, &type))
    if(0 == bus_dbapi_get_json_data(json, &msgdata, &type))
    {
        printf("======>> protomsg: %s\n", msgdata);            
    }
@@ -94,8 +81,7 @@
            else
            {
                printf("======>> json_to_proto fail\n");
                yyjson_doc_free(doc);
                free_reply_msg(repmsg);
                yyjson_doc_free(doc);
                free(msgdata);                
                return false;
            }         
@@ -106,8 +92,23 @@
    }
    free(msgdata);
    free_reply_msg(repmsg);
    return true;
template <class T>  bool bus_dbapi_get_list (void *handle, const char* topic, T & list)
{
    crepmsg *repmsg = NULL;
    size_t len = 0;
    bool iRet = false;
    iRet = bus_dbapi_get_topic_data(handle, topic, &repmsg, len);
    if ( (false == iRet)|| (NULL == repmsg))
    {
        return false;
    }
    iRet = bus_dbapi_get_list(repmsg->data, list);
       free_reply_msg(repmsg);
    return iRet;
}
#endif