فهرست منبع

Merge remote-tracking branch 'loigu/master' into cJSON_Raw

Max Bruckner 8 سال پیش
والد
کامیت
8c58e62597
2فایلهای تغییر یافته به همراه32 افزوده شده و 1 حذف شده
  1. 27 0
      cJSON.c
  2. 5 1
      cJSON.h

+ 27 - 0
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();

+ 5 - 1
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))