除了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