用c写一个简单json处理器之头文件,可能会不断完善吧(二)

/**
    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)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值