json_pointer: find null array elements

json_pointer_get_single_path() returned ENOENT when the array element
at an in-range index was NULL, which is how json-c stores a JSON null.
A null object member was already found, but on [0, null, 2] "/1" failed
with "not found", although RFC 6901 says it references the null value.

The array index is bounds-checked just before, so a NULL element now
resolves like a null member: json_pointer_get() returns 0 and sets
*res to NULL. This also fixes json_patch_apply(), which failed every
"test", "replace" and "remove" on a null array element, and every
"move" and "copy" from one, with "Did not find element referenced by
path field".

Added a json_pointer_get() test, and json_patch_tests.json cases that
mirror the existing null object member ones.
This commit is contained in:
Wleeaf authored and Eric Hawicz committed 2026-10-26 00:39:03 -04:00
1 parent 86fe287188
commit d9b375ff1b
5 files changed
+47 -10

No files matched your search

+25
View File
@@ -291,6 +291,31 @@
"expected": {"foo": null},
"comment": "null value should still be valid obj property replace other value" },
{ "doc": {"foo": [null]},
"patch": [{"op": "test", "path": "/foo/0", "value": null}],
"expected": {"foo": [null]},
"comment": "null value should be valid array element" },
{ "doc": {"foo": [null]},
"patch": [{"op": "replace", "path": "/foo/0", "value": "truthy"}],
"expected": {"foo": ["truthy"]},
"comment": "null value should be valid array element to be replaced with something truthy" },
{ "doc": {"foo": [null, 1]},
"patch": [{"op": "move", "from": "/foo/0", "path": "/bar"}],
"expected": {"foo": [1], "bar": null},
"comment": "null value should be valid array element to be moved" },
{ "doc": {"foo": [null]},
"patch": [{"op": "copy", "from": "/foo/0", "path": "/foo/-"}],
"expected": {"foo": [null, null]},
"comment": "null value should be valid array element to be copied" },
{ "doc": {"foo": [null, 1]},
"patch": [{"op": "remove", "path": "/foo/0"}],
"expected": {"foo": [1]},
"comment": "null value should be valid array element to be removed" },
{ "doc": {"foo": {"foo": 1, "bar": 2}},
"patch": [{"op": "test", "path": "/foo", "value": {"bar": 2, "foo": 1}}],
"expected": {"foo": {"foo": 1, "bar": 2}},