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:
@@ -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';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user