C 实现解析Json字符串

本文介绍了如何在C语言中实现Json字符串的解析,依赖ArrayMap字典映射和ArrayList数组的数据结构。解析完成后,提供了访问Json数据对象属性的接口,包括对Json中的array和object的访问方法。解析过程通过Parse和ParseWithFile接口完成,解析后的Json以结构化对象形式存储,可调用Release方法释放内存。
摘要由CSDN通过智能技术生成

    除了C的标准库之外,依赖两个数据结构的实现,C 实现ArrayMap字典映射 和 C 实现泛型ArrayList数组。实现了标准的json结构解析,并提供一套访问json数据对象属性的接口。


    首先,看数据结构的定义。


typedef enum
{
	json_object,
	json_array,
	json_string,
	json_float,
	json_null,
}
JsonType;


typedef struct
{
   ArrayStrMap(JsonValue*) arrayStrMap[1];
}
JsonObject;


typedef struct
{
   ArrayList(JsonValue*) arrayList[1];
}
JsonArray;


typedef struct
{
	JsonType type;

	union
	{
		/** json_string */
		char*       stringValue;
		/** json_object */
		JsonObject* object;
		/** json_array */
		JsonArray*  array;
		/** json_float */
		float       floatValue;
	};
}
JsonValue;


    Json 就是一个Key-Value结构,value可能有5中类型,array和object类型单独拿出来定义了一下。每一个value都是JsonValue类型的,用联合体来存储类型的值。看着这里并没有给int类型,所有的int类型值是通过float强转得到的。


    对于,array和object类型,给定一组接口访问其内部的数据结构。

    

typedef struct
{
	bool        (*GetBool)         (JsonObject* object, const char* key, bool  defaultValue);
	int         (*GetInt)          (JsonObject* object, const char* key, int   defaultValue);
	float       (*GetFloat)        (JsonObject* object, const char* key, float defaultValue);
	JsonType    (*GetType)         (JsonObject* object, const char* key);

	/**
	 * When JsonValue released string value will free
	 */
	char*       (*GetString)       (JsonObject* object, const char* key, char* defaultValue);

	/** Not found return NULL */
	JsonObject* (*GetObject)       (JsonObject* object, const char* key);

	/** Not found return NULL */
	JsonArray*  (*GetArray)        (JsonObject* object, const char* key);

	const char* (*GetKey)          (JsonObject* object, int   index);

	/** Get JsonObject in index of JsonObject map */
	JsonObject* (*GetObjectByIndex)(JsonObject* object, int   index);

	/** Get JsonArray in index of JsonObject map */
	JsonArray*  (*GetArrayByIndex) (JsonObject* object, int   index);
}
_AJsonObject_;

extern _AJsonObject_ AJsonObject[1];



typedef struct
{
	bool        (*GetBool)      (JsonArray* array, int index);
	int         (*GetInt)       (JsonArray* array, int index);
	float       (*GetFloat)     (JsonArray* array, int index);

	JsonType    (*GetType)      (JsonArray* array, int index);

	/** When JsonValue released string value will free */
	char*       (*GetString)    (JsonArray* array, int index);

	JsonObject* (*GetObject)    (JsonArray* array, int index);
	JsonArray*  (*GetArray)     (JsonArray* array, int index);

}
_AJsonArray_;

extern _AJsonArray_ AJsonArray[1];

    整个Json的解析通过一个接口完成。

    

typedef struct
{

	/**
	 * Parse with Json string, return root JsonValue
	 */
	JsonValue* (*Pa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值