From 19b1d7b327d75dbd7054031368d5ff34bd8657a2 Mon Sep 17 00:00:00 2001 From: wangfq Date: Wed, 1 Jul 2026 08:31:04 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20simple=5Fparse=5Fjson=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=A9=BA=E6=8C=87=E9=92=88=E5=B4=A9=E6=BA=83=E5=92=8C?= =?UTF-8?q?=E6=97=A0\0=E7=BB=93=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复纯数字/布尔/null 值时 strlen(NULL) 崩溃 - 修复对象缺闭合 } 时 strlen(NULL) 崩溃 - 修复 memcpy 后缺少 null terminator - 修复 strlen(value_str) 对未初始化缓冲区调用 - 新增数组 [...] 值类型支持 - 用首字符分发替代 strlen 比大小判断优先级 - simple_json_getarray_item 同步修复 --- .../APP/simple_json.c | 277 +++++++----------- 1 file changed, 111 insertions(+), 166 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/simple_json.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/simple_json.c index 162c705..498d98d 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/simple_json.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/simple_json.c @@ -18,93 +18,71 @@ #include -void simple_parse_json(const char * data, char *key_str, char *value_str) +void simple_parse_json(const char *data, char *key_str, char *value_str) { - char *p, *q, *t, *y; - //char * zq; //[ ] - int len = 0; - - if(data == NULL) - { - printf("\r\nsimple_parse_json data is NULL\r\n"); + const char *p, *q; + int len; + + if (data == NULL || key_str == NULL || value_str == NULL) { return; } - if(strlen(value_str) != 0) - { - printf("clear value:%s\n", value_str); - memset(value_str, 0, strlen(value_str)); - } - + + // Clear output buffer safely + value_str[0] = '\0'; + + // Find key in data p = strstr(data, key_str); - if(p == NULL) return; - p += strlen(key_str) + 1; - -// printf("\nmy_parse_json2, first,data:%s\n", p); - while(*p == ' ') - { - p++; - } -// printf("\nmy_parse_json2, sec,data:%s\n", p); - - q = strchr(p, '{'); - t = strchr(p, '\"'); - y = strchr(p, ','); - //zq = strchr(p, '['); - - if((q == NULL) && (t == NULL) && (y == NULL)) - { - q = strstr(p, "\r\n"); - if(q == NULL) q = strstr(p, "\n"); - if(q == NULL) q = strstr(p, "}"); - - if(q == NULL) len = strlen(p); - else len = strlen(p) - strlen(q); - + if (p == NULL) return; + + // Skip key, colon, and whitespace: "key" : value + p += strlen(key_str); + while (*p == ' ') p++; + if (*p == ':') p++; + while (*p == ' ') p++; + + if (*p == '\0') return; + + // Dispatch by value type (first character after colon) + if (*p == '"') { + // --- Quoted string: "..." -> extract content between quotes --- + const char *start = p + 1; + q = strchr(start, '"'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else if (*p == '{') { + // --- JSON object: { ... } -> extract content between braces --- + const char *start = p + 1; + q = strstr(start, "},"); + if (q == NULL) q = strstr(start, "}\r\n"); + if (q == NULL) q = strstr(start, "}\n"); + if (q == NULL) q = strchr(start, '}'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else if (*p == '[') { + // --- JSON array: [ ... ] -> extract content between brackets --- + const char *start = p + 1; + q = strstr(start, "],"); + if (q == NULL) q = strstr(start, "]\r\n"); + if (q == NULL) q = strstr(start, "]\n"); + if (q == NULL) q = strchr(start, ']'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else { + // --- Plain value: number, true, false, null --- + // Terminated by ',' | '}' | '\\r\\n' | '\\n' + q = strchr(p, ','); + if (q == NULL) q = strchr(p, '}'); + if (q == NULL) q = strstr(p, "\r\n"); + if (q == NULL) q = strstr(p, "\n"); + len = (q != NULL) ? (int)(q - p) : (int)strlen(p); memcpy(value_str, p, len); - return; - } - - if((q == NULL) || ((t != NULL) && (strlen(t) > strlen(q)))) - { - if((y != NULL) && (strlen(y) > strlen(t))) - { - len = strlen(p) - strlen(y); - memcpy(value_str, p, len); - return; - } - else - { - t += 1; - q = strstr(t, "\","); - if(q == NULL) - { - q = strstr(t, "\"\r\n"); - if(q == NULL) - { - q = strstr(t, "\"\n"); - if(q == NULL) - { - q = strstr(t, "\""); - } - } - } - len = strlen(t) - strlen(q); - memcpy(value_str, t, len); - } - } - else - { - q += 1; - y = strstr(q, "},"); - if(y == NULL) - { - y = strstr(q, "}\r\n"); - if(y == NULL) y = strstr(q, "}\n"); - if(y == NULL) y = strchr(q, '}'); - } - len = strlen(q) - strlen(y); - memcpy(value_str, q, len); - return; + value_str[len] = '\0'; } } @@ -120,94 +98,61 @@ char * simpleJsonGetObject(const char * data, const char * key) return NULL; } -void simple_json_getarray_item(const char * data, char *key_str, char *value_str) +void simple_json_getarray_item(const char *data, char *key_str, char *value_str) { - char *p, *q, *t, *y; - //char * zq; //[ ] - int len = 0; - - if(data == NULL) - { - printf("\r\nsimple_parse_json data is NULL\r\n"); + const char *p, *q; + int len; + + if (data == NULL || key_str == NULL || value_str == NULL) { return; } - if(strlen(value_str) != 0) - { - printf("clear value:%s\n", value_str); - memset(value_str, 0, strlen(value_str)); - } - + + value_str[0] = '\0'; + p = strstr(data, key_str); - if(p == NULL) return; - p += strlen(key_str) + 1; - -// printf("\nmy_parse_json2, first,data:%s\n", p); - while(*p == ' ') - { - p++; - } -// printf("\nmy_parse_json2, sec,data:%s\n", p); - - q = strchr(p, '{'); - t = strchr(p, '\"'); - y = strchr(p, ','); - //zq = strchr(p, '['); - - if((q == NULL) && (t == NULL) && (y == NULL)) - { - q = strstr(p, "\r\n"); - if(q == NULL) q = strstr(p, "\n"); - if(q == NULL) q = strstr(p, "}"); - - if(q == NULL) len = strlen(p); - else len = strlen(p) - strlen(q); - + if (p == NULL) return; + + p += strlen(key_str); + while (*p == ' ') p++; + if (*p == ':') p++; + while (*p == ' ') p++; + + if (*p == '\0') return; + + if (*p == '"') { + const char *start = p + 1; + q = strchr(start, '"'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else if (*p == '{') { + const char *start = p + 1; + q = strstr(start, "},"); + if (q == NULL) q = strstr(start, "}\r\n"); + if (q == NULL) q = strstr(start, "}\n"); + if (q == NULL) q = strchr(start, '}'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else if (*p == '[') { + const char *start = p + 1; + q = strstr(start, "],"); + if (q == NULL) q = strstr(start, "]\r\n"); + if (q == NULL) q = strstr(start, "]\n"); + if (q == NULL) q = strchr(start, ']'); + len = (q != NULL) ? (int)(q - start) : (int)strlen(start); + memcpy(value_str, start, len); + value_str[len] = '\0'; + + } else { + q = strchr(p, ','); + if (q == NULL) q = strchr(p, '}'); + if (q == NULL) q = strstr(p, "\r\n"); + if (q == NULL) q = strstr(p, "\n"); + len = (q != NULL) ? (int)(q - p) : (int)strlen(p); memcpy(value_str, p, len); - return; - } - - if((q == NULL) || ((t != NULL) && (strlen(t) > strlen(q)))) - { - if((y != NULL) && (strlen(y) > strlen(t))) - { - len = strlen(p) - strlen(y); - memcpy(value_str, p, len); - return; - } - else - { - t += 1; - q = strstr(t, "\","); - if(q == NULL) - { - q = strstr(t, "\"\r\n"); - if(q == NULL) - { - q = strstr(t, "\"\n"); - if(q == NULL) - { - q = strstr(t, "\""); - } - } - } - len = strlen(t) - strlen(q); - memcpy(value_str, t, len); - } - } - else - { - q += 1; - y = strstr(q, "},"); - if(y == NULL) - { - y = strstr(q, "}\r\n"); - if(y == NULL) y = strstr(q, "}\n"); - if(y == NULL) y = strchr(q, '}'); - } - len = strlen(q) - strlen(y); - memcpy(value_str, q, len); - return; + value_str[len] = '\0'; } } - -