#include "sc_json.h"
#include <ctype.h>
/**
读取json的结构
_flag取值标志如下:
0 表示 有双引号是 是 字符串char*
1 表示 无双引号,开头是'[' 是数组,此时用idx索引
2 表示 无双引号,开头是'{' 是对象
3 表示 无双引号,有小数点 是double
0 表示 无双引号,是null 表示 NULL=_value
4 表示 无双引号,无小数点,为true和false 表示int值 后者为1和0
**/
struct _json_value {
LIST_HEAD_NODE;
union {
_T_const char *name;
int idx;
}_un_key;
_T_const char *_value;
int _flag;
};
//设置_json_value 数据的数据标志
static void __json_set_flag(struct _json_value *jv, char *value)
{
char c = *value, *s = value;
int flag = 4;
if (c == '"')
flag = 0;
else if (c == '[')
flag = 1;
else if (c == '{')
flag = 2;
else {
while ((c = *s++) != '\0'&&c != '.')//犯了致命错误 c == *s++
;
if (c == '.')
flag = 3;
}
jv->_value = value;
if (flag >= 4) {
if (strcmp("null", value) == 0) {
jv->_value = NULL;
flag = 0;
}
else if (strcmp("false", value) == 0) {
value[0] = '0';
value[1] = '\0';
}
else if (strcmp("true", value) == 0) {
value[0] = '1';
value[1] = '\0';
}
}
jv->_flag = flag;
}
//去掉多余的'"'
static void __json_melt(char **pstr)
{
char *str = *pstr;
if (*str != '"')
return;
*pstr = ++str;
//找到最后一个字符
while (*str != '\0')
++str;
str[-1] = '\0';
}
//创建对象的_json_value值
static struct _json_value* ___json_value_object_new(char *jvstr)
{
//采用尾查法
struct _json_value *jv = malloc(sizeof(struct _json_value));
if (jv == NULL) {
sl_debug("_json_value_object_new malloc 失败!");
return NULL;
}
jv->_un_key.name = jvstr;
//找到':'的后一个字符
char *tmp = jvstr, c;
while ((c = *tmp++) != '\0'&&c != ':')
;
if (c == '\0') {
sl_error("_json_value_object_new 解析[%s] 失败!\n", jvstr);
return NULL;
}
//截取掉':'
tmp[-1] = '\0';
__json_set_flag(jv, tmp);
__json_melt(&jv->_un_key.name);
__json_melt(&jv->_value);
return jv;
}
//通过名称查找的子方法
static int ___json_value_cmp_name(const struct _json_value *jv, const char *name)
{
return strcmp(jv->_un_key.name, name);
}
//通过索引查找的子方法
static int ___json_value_cmp_idx(const struct _json_value *jv, const int *pidx)
{
return jv->_un_key.idx - *pidx;
}
//创建对象的_json_value值
static struct _json_value* ___json_value_array_new(int idx, char *jvstr)
{
//采用尾查法
struct _json_value *jv = malloc(sizeof(struct _json_value));
if (jv == NULL) {
sl_debug("_json_value_object_new malloc 失败!");
return NULL;
}
jv->_un_key.idx = idx;
__json_set_flag(jv, jvstr);
__json_melt(&jv->_value);
return jv;
}
/**
json_malloc_readend - 从文件中读取json字符串,跳过多余的空格字符
需要自己释放
#flag_t:错误标志
@path:文件路径
@txt:输出参数,返回输出字符串
**/
flag_t
json_malloc_readend(const char *path, _T_out char **txt)
{
if (path == NULL || txt == NULL) {
sl_debug("json_malloc_readend 检测到[path == NULL || txt == NULL]");
return _RF_EP;
}
//打开文件
FILE *file = fopen(path, "rb");
if (file == NULL) {
sl_error("json_malloc_readend 文件[%s]打开失败", path);
return _RF_EF;
}
int size = _INT_JSON_STR_ADD, len = 0;
char *str = malloc(sizeof(char)*size);
if (str == NULL) {
sl_debug("json_malloc_readend malloc失败!");
return _RF_EM;
}
int c;
char istwo = 0;
while ((c = fgetc(file)) != EOF) {
if (json_isspace(c) && istwo == 0)//跳过无用的空格字符,isspace检测非空字符,返回0
continue;
if (c == '"') {
if (istwo == 0)
istwo = 1;
else if (str[len - 1] != '\\')
istwo = 0;
}
str[len++] = c;
if (len == size) {
size += _INT_JSON_STR_ADD;
char *tmp = realloc(str, sizeof(char)*size);
if (tmp == NULL) {
sl_debug("json_malloc_readend realloc失败!");
free(str);//释放内存,以免内存泄露
return _RF_EM;
}
str = tmp;
}
}
str[len++] = '\0';
//内存缩小,realloc不会发生异常,并返回结果
*txt = realloc(str, sizeof(char)*len);
//关闭文件管道
fclose(file);
return _RF_OK;
}
/**
json_str_tight - 去除空字符,在字符串json_str中
#int:返回修改后串的长度
@json_str:从字符串中消除空字符串
**/
int
json_str_tight(char *json_str)
{
if (json_str == NULL) {
sl_infos("json_str_tight 检测到[json_str == NULL]");
return 0;
}
int i = 0, j = -1, c;
char istwo = 0;//1 表示双引号开始
while ((c = json_str[++j]) != '\0') {
if (json_isspace(c) && istwo == 0)//跳过无用的空格字符,isspace检测非空字符,返回0
continue;
if (c == '"') {
if (istwo == 0)
istwo = 1;
else if (json_str[i - 1] != '\\')
istwo = 0;
}
json_str[i++] = c;
}
json_str[i] = c;
//最后返回修改后串的长度
return i;
}
/**
json_malloc_str_tight - 从json_str串中,紧凑的生成一个新串保存在nj_str中
去掉无用空格字符
#flag_t:运行状态,>=0表示成功,并且值为*nj_str串的长度
@json_str:原串
@nj_str:输出指向新串的指针
**/
flag_t
json_malloc_str_tight(const char *json_str, _T_out char **nj_str)
{
if (json_str == NULL || *json_str == '\0' || nj_str == NULL) {
sl_debug("json_malloc_str_tight 检测到\
[json_str == NULL || *json_str == '\0' || nj_str == NULL]");
return _RF_EP;
}
//深拷贝内存
char *str = STR_malloc(json_str);
if (str == NULL) {
sl_debug("json_malloc_str_tight csv_strcpy malloc执行失败!");
return _RF_EM;
}
//去掉杂质
int len = json_str_tight(str);
//重新分配内存,缩小一下
*nj_str = realloc(str, sizeof(char)*(len + 1));
return len;
}
/**
json_by_object - 获取list_json链表,从json对象串中获取
jstr串必须是malloc的串,必须经过紧凑处理的json_str_tight
#list_json:构造失败返回NULL
@jstr:原本字符串
**/
alist_t
json_by_object(char *jstr)
{
if (jstr == NULL || *jstr != '{') {
sl_debug("json_by_object 检测到[jstr == NULL || *jstr!='{']");
return NULL;
}
alist_t lj = NULL;
//切词添加值
char *s = jstr, *r = s + 1, c;
char istwo = 0;//1表示存在 "开始
char dc = 0, isdc = 0;//解决嵌套定义问题
while ((c = *++s) != '\0') {
if (c == '"') {
if (istwo == 0)
istwo = 1;
else if (s[-1] != '\\')
istwo = 0;
continue;
}
//处理嵌套定义问题
if (c == '[' || c == '{') {
if (isdc == 0) {
dc = c;
++isdc;
}
else if (dc == c)
++isdc;
continue;
}
if (c - dc == 2 && isdc > 0) {
--isdc;
continue;
}
//处理要添加的结点问题
if ((c == ',' || c == ']') && istwo == 0 && isdc == 0) {
*s = '\0';
//中间开始切词
struct _json_value *jv = ___json_value_object_new(r);
alist_add(&lj, jv);//hash 确实时候做k,v,链表就是大众化操作
r = s + 1;
}
}
return lj;
}
/**
json_object_str - 从对象链表jol中获取,对应名字name的值
#const char*:返回的常量字符串
@jol:json对象链表
@name:json数据子项中的名字
**/
const char*
json_object_str(alist_t jol, const char *name)
{
if (jol == NULL || name == NULL) {
sl_debug("json_object_str 检测到[jol == NULL || name == NULL]");
return NULL;
}
struct _json_value *jv = alist_find(jol, name, ___json_value_cmp_name);
if (jv == NULL) {
sl_error("json_object_str alist_find 没有找到[%s]的对象值,或者是无效的数据转换!",
name);
return NULL;
}
//找到了返回结果
return jv->_value;
}
/**
json_object_double - 从对象链表jol中获取,对应名字name的值
#double:返回的浮点数
@jol:json对象链表
@name:json数据子项中的名字
**/
double
json_object_double(alist_t jol, const char *name)
{
if (jol == NULL || name == NULL) {
sl_debug("json_object_double 检测到[jol == NULL || name == NULL]");
return -1.0;
}
struct _json_value *jv = alist_find(jol, name, ___json_value_cmp_name);
if (jv == NULL || jv->_flag < 3) {
sl_error("json_object_double alist_find 没有找到[%s]的对象值,或者是无效的数据转换!",
name);
return -1.0;
}
//合法返回结果
return atof(jv->_value);
}
/**
json_object_int - 从对象链表jol中获取,对应名字name的值
#int:返回的浮点数
@jol:json对象�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
simplec.zip (43个子文件)
__PreviewImage.ico 4KB
glew32.dll 395KB
pthreadVC2.lib 30KB
glew32s.lib 2MB
LOGIN
main.c 533B
pthreadVC2.dll 55KB
freeglut.lib 39KB
MODULE
FREEGLUT
freeglut_std.h 27KB
freeglut.h 703B
freeglut_ext.h 10KB
glut.h 660B
PTHREAD
sched.h 5KB
pthread.h 43KB
semaphore.h 4KB
SC_CONSOLE
alist.c 6KB
sc_config.h 2KB
sc_log.h 468B
chead.h 3KB
sc_string.h 3KB
sc_config.ini 387B
sc_config.c 5KB
sc_head.c 982B
vlist.c 3KB
sc_csv.h 2KB
sc_json.c 16KB
sc_json.h 5KB
sc_csv.c 6KB
vlist.h 1KB
sc_log.c 3KB
alist.h 4KB
sc_head.h 864B
sc_string.c 7KB
GLEW
glew.h 1014KB
glxew.h 73KB
wglew.h 63KB
RESOURCE
ICO
diagnoseSystem.ico 4KB
fixie.ico 4KB
freeglut.dll 194KB
__TemplateIcon.ico 4KB
MyTemplate.vstemplate 5KB
simplec_template.vcxproj 8KB
glew32.lib 605KB
simplec_template.vcxproj.filters 7KB
共 43 条
- 1
资源评论
wangzhione
- 粉丝: 1
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功