- 修复纯数字/布尔/null 值时 strlen(NULL) 崩溃 - 修复对象缺闭合 } 时 strlen(NULL) 崩溃 - 修复 memcpy 后缺少 null terminator - 修复 strlen(value_str) 对未初始化缓冲区调用 - 新增数组 [...] 值类型支持 - 用首字符分发替代 strlen 比大小判断优先级 - simple_json_getarray_item 同步修复
159 lines
4.7 KiB
C
159 lines
4.7 KiB
C
/*******************************************************
|
|
* File name: simple_json.c
|
|
* Author : wfq
|
|
* Versions : 1.0
|
|
* Description: simple json parse function.
|
|
* Do not solve the completed json_string or string with json-string.
|
|
* Completed: like array.
|
|
* Must satisfy the yipai dev-protocol, and test by yipai dev-protocol.
|
|
* History:
|
|
* 1.Date: 2016-10-10
|
|
* Author: wfq
|
|
* Action: create
|
|
*********************************************************/
|
|
|
|
|
|
#include "simple_json.h"
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
void simple_parse_json(const char *data, char *key_str, char *value_str)
|
|
{
|
|
const char *p, *q;
|
|
int len;
|
|
|
|
if (data == NULL || key_str == NULL || value_str == NULL) {
|
|
return;
|
|
}
|
|
|
|
// Clear output buffer safely
|
|
value_str[0] = '\0';
|
|
|
|
// Find key in data
|
|
p = strstr(data, key_str);
|
|
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);
|
|
value_str[len] = '\0';
|
|
}
|
|
}
|
|
|
|
|
|
char * simpleJsonGetObject(const char * data, const char * key)
|
|
{
|
|
if(data == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void simple_json_getarray_item(const char *data, char *key_str, char *value_str)
|
|
{
|
|
const char *p, *q;
|
|
int len;
|
|
|
|
if (data == NULL || key_str == NULL || value_str == NULL) {
|
|
return;
|
|
}
|
|
|
|
value_str[0] = '\0';
|
|
|
|
p = strstr(data, key_str);
|
|
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);
|
|
value_str[len] = '\0';
|
|
}
|
|
}
|