Преглед изворни кода

reformatting: cJSONUtils_MergePatch

Max Bruckner пре 8 година
родитељ
комит
01a813f642
1 измењених фајлова са 28 додато и 14 уклоњено
  1. 28 14
      cJSON_Utils.c

+ 28 - 14
cJSON_Utils.c

@@ -725,21 +725,35 @@ void cJSONUtils_SortObject(cJSON *object)
 
 cJSON* cJSONUtils_MergePatch(cJSON *target, cJSON *patch)
 {
-	if (!patch || patch->type != cJSON_Object) {cJSON_Delete(target);return cJSON_Duplicate(patch,1);}
-	if (!target || target->type != cJSON_Object) {cJSON_Delete(target);target=cJSON_CreateObject();}
+    if (!patch || (patch->type != cJSON_Object))
+    {
+        /* scalar value, array or NULL, just duplicate */
+        cJSON_Delete(target);
+        return cJSON_Duplicate(patch, 1);
+    }
 
-	patch=patch->child;
-	while (patch)
-	{
-		if (patch->type == cJSON_NULL) cJSON_DeleteItemFromObject(target,patch->string);
-		else
-		{
-			cJSON *replaceme=cJSON_DetachItemFromObject(target,patch->string);
-			cJSON_AddItemToObject(target,patch->string,cJSONUtils_MergePatch(replaceme,patch));
-		}
-		patch=patch->next;
-	}
-	return target;
+    if (!target || (target->type != cJSON_Object))
+    {
+        cJSON_Delete(target);
+        target = cJSON_CreateObject();
+    }
+
+    patch = patch->child;
+    while (patch)
+    {
+        if (patch->type == cJSON_NULL)
+        {
+            /* NULL is the indicator to remove a value, see RFC7396 */
+            cJSON_DeleteItemFromObject(target, patch->string);
+        }
+        else
+        {
+            cJSON *replaceme = cJSON_DetachItemFromObject(target, patch->string);
+            cJSON_AddItemToObject(target, patch->string, cJSONUtils_MergePatch(replaceme, patch));
+        }
+        patch = patch->next;
+    }
+    return target;
 }
 
 cJSON *cJSONUtils_GenerateMergePatch(cJSON *from,cJSON *to)