mirror of https://github.com/DaveGamble/cJSON
refactor cJSONUtils_MergePatch
This commit is contained in:
parent
01d656bebc
commit
11b8a8cd76
|
@ -1145,8 +1145,10 @@ CJSON_PUBLIC(void) cJSONUtils_SortObject(cJSON * const object)
|
||||||
object->child = cJSONUtils_SortList(object->child);
|
object->child = cJSONUtils_SortList(object->child);
|
||||||
}
|
}
|
||||||
|
|
||||||
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch)
|
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch)
|
||||||
{
|
{
|
||||||
|
cJSON *patch_child = NULL;
|
||||||
|
|
||||||
if (!cJSON_IsObject(patch))
|
if (!cJSON_IsObject(patch))
|
||||||
{
|
{
|
||||||
/* scalar value, array or NULL, just duplicate */
|
/* scalar value, array or NULL, just duplicate */
|
||||||
|
@ -1160,20 +1162,20 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch)
|
||||||
target = cJSON_CreateObject();
|
target = cJSON_CreateObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
patch = patch->child;
|
patch_child = patch->child;
|
||||||
while (patch)
|
while (patch_child != NULL)
|
||||||
{
|
{
|
||||||
if (cJSON_IsNull(patch))
|
if (cJSON_IsNull(patch_child))
|
||||||
{
|
{
|
||||||
/* NULL is the indicator to remove a value, see RFC7396 */
|
/* NULL is the indicator to remove a value, see RFC7396 */
|
||||||
cJSON_DeleteItemFromObject(target, patch->string);
|
cJSON_DeleteItemFromObject(target, patch_child->string);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cJSON *replaceme = cJSON_DetachItemFromObject(target, patch->string);
|
cJSON *replace_me = cJSON_DetachItemFromObject(target, patch_child->string);
|
||||||
cJSON_AddItemToObject(target, patch->string, cJSONUtils_MergePatch(replaceme, patch));
|
cJSON_AddItemToObject(target, patch_child->string, cJSONUtils_MergePatch(replace_me, patch_child));
|
||||||
}
|
}
|
||||||
patch = patch->next;
|
patch_child = patch_child->next;
|
||||||
}
|
}
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ CJSON_PUBLIC(int) cJSONUtils_ApplyPatches(cJSON * const object, const cJSON * co
|
||||||
|
|
||||||
/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */
|
/* Implement RFC7386 (https://tools.ietf.org/html/rfc7396) JSON Merge Patch spec. */
|
||||||
/* target will be modified by patch. return value is new ptr for target. */
|
/* target will be modified by patch. return value is new ptr for target. */
|
||||||
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, cJSON *patch);
|
CJSON_PUBLIC(cJSON *) cJSONUtils_MergePatch(cJSON *target, const cJSON * const patch);
|
||||||
/* generates a patch to move from -> to */
|
/* generates a patch to move from -> to */
|
||||||
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to);
|
CJSON_PUBLIC(cJSON *) cJSONUtils_GenerateMergePatch(cJSON *from, cJSON *to);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue