From b38ddaa132253b4bc35d9b5359ce0ea5d710bae0 Mon Sep 17 00:00:00 2001
From: cheliequan <liequanche@126.com>
Date: 星期四, 12 一月 2023 10:22:47 +0800
Subject: [PATCH] 优化jsontoprotobuf函数,支持msg参数有值和success为false的情况。
---
util.cpp | 93 ++++++++++++++++++++++++++++++++++++++++------
1 files changed, 81 insertions(+), 12 deletions(-)
diff --git a/util.cpp b/util.cpp
index 087a031..ba08539 100644
--- a/util.cpp
+++ b/util.cpp
@@ -51,6 +51,69 @@
return json;
}
+extern "C" int bus_dbapi_get_json_data(const char * json, char ** pptr_data)
+{
+ /*{
+ "success": true,
+ "msg": "",
+ "data": {
+ "alarm_ip": "192.168.20.189",
+ "alarm_port": 9200,
+ }
+ }*/
+ int ret = -1;
+ size_t data_len = 0;
+ size_t success_len = 0;
+ size_t total_len = 0;
+ const char * ptr_data = NULL;
+ const char * ptr_value = NULL;
+ const char * success_name = "success";
+ const char * msg_name = "msg";
+ const char * data_quote_name = "\"data\"";
+
+ if(NULL == *pptr_data)
+ {
+ return -1;
+ }
+
+
+ // Read JSON and get root
+ yyjson_doc *doc = yyjson_read(json, strlen(json), 0);
+ yyjson_val *root = yyjson_doc_get_root(doc);
+
+ // Get root["success"]
+ yyjson_val *success = yyjson_obj_get(root, success_name);
+
+ int success_val = yyjson_get_bool(success);
+ printf("success: %d\n", success_val);
+ printf("success_len:%lu\n",yyjson_get_len(success));
+ if(!success_val)
+ {
+ yyjson_doc_free(doc);
+ return -1;
+ }
+
+ // Get root["msg"]
+ //yyjson_val *msg = yyjson_obj_get(root, "msg");
+ yyjson_val *msg = yyjson_obj_get(root, "msg");
+ printf("msg: %s\n", yyjson_get_str(msg));
+
+ total_len = strlen(json);
+ ptr_data = strstr(json, data_quote_name);
+ ptr_value = strchr(ptr_data, '{');
+
+ //鍘婚櫎鏈�鍚庝竴涓�"}""
+ data_len = total_len - (ptr_value - json) - 1;
+ memcpy(*pptr_data, ptr_value, data_len);
+ ret = 0;
+
+ // Free the doc
+ yyjson_doc_free(doc);
+
+ // All functions accept NULL input, and return NULL on error.
+ return ret;
+}
+
bool bus_dbapi_get(void *handle, const char* topic, google::protobuf::Message& message) {
const auto topicl = strlen(topic);
@@ -65,21 +128,27 @@
return false;
}
- char* msgdata = repmsg->data + 32;
- msgdata[strlen(msgdata) -1] = '\0';
- printf("======>> protomsg: %s\n", msgdata);
-
- std::string jsonString = msgdata;
- if (json_to_proto(jsonString, message)) {
- printf("======>> json_to_proto done\n");
-
- } else {
- printf("======>> json_to_proto fail\n");
- return false;
+ int msglen = strlen(repmsg->data);
+ char* msgdata = (char *)malloc(msglen);
+ memset(msgdata, 0 , msglen);
+
+ if(0 == bus_dbapi_get_json_data((const char *)repmsg->data, &msgdata))
+ {
+ printf("======>> protomsg: %s\n", msgdata);
+ std::string jsonString = msgdata;
+ if (json_to_proto(jsonString, message))
+ {
+ printf("======>> json_to_proto done\n");
+ }
+ else
+ {
+ printf("======>> json_to_proto fail\n");
+ return false;
+ }
}
+ free(msgdata);
free_reqmsg(reqmsg);
-
free(reqData);
return true;
--
Gitblit v1.8.0