/**
json处理器
php开发工程师 毕康
cabing_2005@126.com
**/
#ifndef __JSON_H__
#define __JSON_H__ 1
#endif
/**
json官网
http://www.json.org/
string
使用双引号括起来的数据
number
正负号
以0或者非开始的任意数字
小数点
任意多的数字
e/E
+/-
任意数字
object
key:value
以{开头 }结尾
基本数据单元是:string:value
基本数据单元用,分隔
array
以[开头 ]结尾
基本数据单元:value
基本数据单元,分隔
value
包括 string number array object
特别的
true/false
null
基本的功能
json的字符串转换成json对象
json对象转换成字符串
创建json对象
json对象的append
json对象在key前插入
json对象在key后插入
json对象根据key查找
json对象根据key的删除
需要考虑的
内存的创建和释放
特殊字符的处理
构建一个数据基本的结构,构建一个链表结构
**/
//整数,小数,字符串,bool,
//array object
#define True 1
#define False 0
#define BASEDATA_MALLOC_FAILD -1111
#define STRING_LEN_ERR -1112
//定义基础类型的处理
#define BASE_TYPE_MAX 4
//区分json的基本类型
typedef enum JSON_TYPE_
{
JSON_NULL = 1,
JSON_BOOL = 2,
JSON_INT = 3,
JSON_FLOAT = 4,
JSON_STRING = 5,
JSON_ARRAY = 6,
JSON_OBJECT = 7,
}JSON_TYPE;
typedef short Jbool;
typedef long Jnumber;
typedef double Jfloat;
typedef char* Jstring;
//存储json的基础数据
typedef union BaseValue_{
Jnumber intVal;
Jfloat doubleVal;
Jstring strVal;
Jbool boolVal;
}BaseValue;
typedef struct RefValue_ Refvalue;
//数据的引用情况
typedef struct RefValue_{
BaseValue baseVal;
Jbool isRef;//是否是引用
Jnumber refCount;//被引用的次数
}Refvalue;
typedef struct JsonValue_ JsonValue;
//json的存储
struct JsonValue_{
JSON_TYPE jsonType;//类型
Refvalue *refValue;
Jstring key;//键值 object 专有
JsonValue *child;//孩子
JsonValue *next;//下一个同级的元素
Refvalue *global_head[BASE_TYPE_MAX];//4个列表指针把所有的json数据都串起来
};
//定义json的分配和释放内存的函数
typedef struct Json_{
Jnumber objCount;
Jnumber totalCount;
JsonValue *head;
JsonValue *tail;
Refvalue *global_head[BASE_TYPE_MAX];//4个列表指针把所有的json数据都串起来
int (*match)(const JsonValue *key1,const JsonValue *key2);
void (*create)(void *data);
void (*destroy)(void *data);
}Json;
//内存申请和释放
JsonValue* jcreate(short create_data);
void jdestroy(JsonValue* value);
//创建json对象
void json_init(Json *json,void (*create)(void *data),
void (*destroy)(void *data));
//比较两个串是否相等
int json_match(const JsonValue *key1,const JsonValue *key2);
//创建基本数据
JsonValue* jcreate_null();
JsonValue* jcreate_bool(Jbool val);
JsonValue* jcreate_int(Jnumber val);
JsonValue* jcreate_float(Jfloat val);
JsonValue* jcreate_string(const Jstring);
//创建数组
int jcreate_array();
//插入数据,默认是在尾部插入数据
int jarray_insert(JsonValue *jarray, JsonValue *jvalue1,const JsonValue *jvalue2);
//删除数据,默认是在尾部删除数据
int jarray_rm(JsonValue *jarray,const JsonValue *jvalue1,const JsonValue **jvalue2);
//以json格式输出数据
int print_jarray(JsonValue *jarray);
//创建对象
int jcreate_object();
//在pj元素后插入一个元素,如果element为空,则插入到链表尾部
int json_append(Json *json,JsonValue *pj,JsonValue *jvalue);
//删除pj后面的那个元素,如果element为空,则删除链表头元素
int json_remove(Json *json,JsonValue *pj,JsonValue **jvalue);
int json_destroy(Json *json);
//json对象[数组]打印成json串。递归处理。
char* parser_to_str(Json *json);
//json串转换成json对象[数组]
Json* parser_to_json(char *str);
//JsonValue引用值
#define jbase_value(jval) ((jval)->refValue)->baseVal
#define jbase_is_ref(jval) ((jval)->refValue)->isRef
#define jbase_is_refcount(jval) ((jval)->refValue)->refCount
//JsonValue的各种值
#define jbase_bool(jval) (((jval)->refValue)->baseVal).boolVal
#define jbase_number(jval) (((jval)->refValue)->baseVal).intVal
#define jbase_double(jval) (((jval)->refValue)->baseVal).doubleVal
#define jbase_string(jval) (((jval)->refValue)->baseVal).strVal
//json
#define json_count(json) ((json)->totalCount)
#define json_obj_count(json) ((json)->objCount)
用c写一个简单json处理器之头文件,可能会不断完善吧(二)
最新推荐文章于 2023-10-28 12:06:39 发布