refactor: simple_parse_json 修复空指针崩溃和无\0结尾

- 修复纯数字/布尔/null 值时 strlen(NULL) 崩溃
- 修复对象缺闭合 } 时 strlen(NULL) 崩溃
- 修复 memcpy 后缺少 null terminator
- 修复 strlen(value_str) 对未初始化缓冲区调用
- 新增数组 [...] 值类型支持
- 用首字符分发替代 strlen 比大小判断优先级
- simple_json_getarray_item 同步修复
This commit is contained in:
wangfq
2026-07-01 08:31:04 +08:00
parent 735af8c0eb
commit 19b1d7b327

View File

@@ -18,93 +18,71 @@
#include <stdio.h>
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';
}
}