diff --git a/cJSON.c b/cJSON.c index d20341a5c94ef1e6ad3aae5426d3bb107245faab..237bd343ee11613d4bd389853723ce8f4775ecab 100644 --- a/cJSON.c +++ b/cJSON.c @@ -989,6 +989,13 @@ static char *print_value(const cJSON *item, int depth, cjbool fmt, printbuffer * case cJSON_Number: out = print_number(item, p); break; + case cJSON_Raw: + out = ensure(p, strlen(item->valuestring)); + if (out) + { + strcpy(out, item->valuestring); + } + break; case cJSON_String: out = print_string(item, p); break; @@ -1016,6 +1023,9 @@ static char *print_value(const cJSON *item, int depth, cjbool fmt, printbuffer * case cJSON_Number: out = print_number(item, 0); break; + case cJSON_Raw: + out = cJSON_strdup(item->valuestring); + break; case cJSON_String: out = print_string(item, 0); break; @@ -1988,6 +1998,23 @@ cJSON *cJSON_CreateString(const char *string) return item; } +extern cJSON *cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = cJSON_strdup(raw); + if(!item->valuestring) + { + cJSON_Delete(item); + return 0; + } + } + + return item; +} + cJSON *cJSON_CreateArray(void) { cJSON *item = cJSON_New_Item(); diff --git a/cJSON.h b/cJSON.h index 2b45b5a57f74708f1327929550f213ce05b68cd1..70641a22fe696c8f6c89df9223e9b569f7bf8e6c 100644 --- a/cJSON.h +++ b/cJSON.h @@ -38,6 +38,7 @@ extern "C" #define cJSON_String (1 << 4) #define cJSON_Array (1 << 5) #define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) //< raw json #define cJSON_IsReference 256 #define cJSON_StringIsConst 512 @@ -54,7 +55,7 @@ typedef struct cJSON /* The type of the item, as above. */ int type; - /* The item's string, if type==cJSON_String */ + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ char *valuestring; /* The item's number, if type==cJSON_Number */ int valueint; @@ -105,6 +106,8 @@ extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); +// raw json +extern cJSON *cJSON_CreateRaw(const char *raw); extern cJSON *cJSON_CreateArray(void); extern cJSON *cJSON_CreateObject(void); @@ -155,6 +158,7 @@ extern void cJSON_Minify(char *json); #define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s)) /* When assigning an integer value, it needs to be propagated to valuedouble too. */ #define cJSON_SetIntValue(object,val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))