From 06008b0444d25f4a3f032a9c1c297e8eb2f0cd69 Mon Sep 17 00:00:00 2001 From: Jiri Zouhar Date: Mon, 14 Nov 2016 11:20:10 +0100 Subject: [PATCH] add support to insert raw json --- cJSON.c | 27 +++++++++++++++++++++++++++ cJSON.h | 6 +++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index ae70fc6..36addb3 100644 --- a/cJSON.c +++ b/cJSON.c @@ -960,6 +960,13 @@ static char *print_value(const cJSON *item, int depth, int fmt, printbuffer *p) 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; @@ -987,6 +994,9 @@ static char *print_value(const cJSON *item, int depth, int fmt, printbuffer *p) 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; @@ -1947,6 +1957,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 c2b8d57..538d05e 100644 --- a/cJSON.h +++ b/cJSON.h @@ -36,6 +36,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 @@ -52,7 +53,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; @@ -101,6 +102,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); @@ -148,6 +151,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))