sunchb_cson/adapter/cjson/cjson_impl.c

147 lines
3.3 KiB
C

/**
* @file cjson_impl.c
* @author sun_chb@126.com
*/
#include "cJSON.h"
#include "cson.h"
#include "string.h"
#include "stdio.h"
// for RT-Thread
#ifdef __RTTHREAD__
#include "rtthread.h"
#define printf rt_kprintf
#endif // __RTTHREAD__
cson_t cjson_impl_object_get(const cson_t object, const char* key){
return cJSON_GetObjectItem((cJSON*)object, key);
}
cson_type cjson_impl_typeof(cson_t object){
switch(((cJSON*)object)->type){
case cJSON_Invalid:
case cJSON_NULL:
return CSON_NULL;
case cJSON_False:
return CSON_FALSE;
case cJSON_True:
return CSON_TRUE;
case cJSON_Number:
return CSON_REAL;
case cJSON_String:
case cJSON_Raw:
return CSON_STRING;
case cJSON_Array:
return CSON_ARRAY;
case cJSON_Object:
return CSON_OBJECT;
default:
return CSON_NULL;
}
}
cson_t cjson_impl_loadb(const char *buffer, size_t buflen){
cson_t ret = NULL;
ret = cJSON_Parse(buffer);
if(!ret){
printf("parse stop with:%s\n", cJSON_GetErrorPtr());
}
return ret;
}
void cjson_impl_decref(cson_t object){
cJSON_Delete((cJSON*)object);
}
const char *cjson_impl_string_value(const cson_t object){
return cJSON_GetStringValue((cJSON*)object);
}
size_t cjson_impl_string_length(const cson_t object){
return strlen(cJSON_GetStringValue((cJSON*)object));
}
long long cjson_impl_integer_value(const cson_t object){
return ((cJSON*)object)->valueint;
}
double cjson_impl_real_value(const cson_t object){
return ((cJSON*)object)->valuedouble;
}
char cjson_impl_bool_value(const cson_t object){
return ((cJSON*)object)->type == cJSON_True;
}
size_t cjson_impl_array_size(const cson_t object){
return cJSON_GetArraySize((cJSON*)object);
}
cson_t cjson_impl_array_get(const cson_t object, size_t index){
return cJSON_GetArrayItem((cJSON*)object, index);
}
cson_t cjson_impl_new(){
return cJSON_CreateObject();
}
char* cjson_impl_to_string(cson_t object){
return cJSON_PrintUnformatted((cJSON*)object);
}
cson_t cjson_impl_integer(long long val){
cJSON* tmp = cJSON_CreateNumber(0);
cJSON_SetNumberValue(tmp, val);
return tmp;
}
cson_t cjson_impl_string(const char* val){
return cJSON_CreateString(val);
}
cson_t cjson_impl_bool(char val){
return cJSON_CreateBool(val);
}
cson_t cjson_impl_real(double val){
return cJSON_CreateNumber(val);
}
cson_t cjson_impl_array(){
return cJSON_CreateArray();
}
int cjson_impl_array_add(cson_t array, cson_t obj){
cJSON_AddItemToArray((cJSON*)array, (cJSON*)obj);
return 0;
}
int cjson_impl_object_set_new(cson_t rootObj, const char* field, cson_t obj){
cJSON_AddItemToObject((cJSON*)rootObj, field, (cJSON*)obj);
return 0;
}
cson_interface csomImpl = {
cjson_impl_object_get,
cjson_impl_typeof,
cjson_impl_loadb,
cjson_impl_decref,
cjson_impl_string_value,
cjson_impl_string_length,
cjson_impl_integer_value,
cjson_impl_real_value,
cjson_impl_bool_value,
cjson_impl_array_size,
cjson_impl_array_get,
cjson_impl_new,
cjson_impl_to_string,
cjson_impl_integer,
cjson_impl_string,
cjson_impl_bool,
cjson_impl_real,
cjson_impl_array,
cjson_impl_array_add,
cjson_impl_object_set_new
};