|
@@ -725,21 +725,35 @@ void cJSONUtils_SortObject(cJSON *object)
|
|
|
|
|
|
cJSON* cJSONUtils_MergePatch(cJSON *target, cJSON *patch)
|
|
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)
|
|
cJSON *cJSONUtils_GenerateMergePatch(cJSON *from,cJSON *to)
|