 json_pointer: introduce json_pointer_get_internal() for internal usage
For JSON patch, we require that we get access to the parent of a JSON
object as well in order to do some operations via the API.
For example, given the object:
{
"foo": "bar",
"array", [ 1, 2, 3]
}
Using JSON pointer with the path
* '/foo' will return 'bar' of type string
* '/array/0' will return '1', of type integer
The problem is, that if we do 'json_object_put()' on any of the objects
above, this will not detach them from the parent, because there is no
information back to the parent.
One way to fix this, is to introduce links back to the parent, and have
these links be made by 'json_object_array_{put,insert}_idx()' and
'json_object_object_add{_ex}()'[1].
[1] For json_object_object_add_ex() we would need to de-constify the second
parameter, as we need to change it's internal state when being added to a
parent object. It may break some applications, but who knows.
But, since this information is needed mostly for JSON patch, another way to
address this, is to also retrieve the parent of an object via JSON pointer
and use json_object_object_del() and json_object_array_del_idx() on the
object's parent.
Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
4 years ago |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /*
- * $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
- *
- * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
- * Michael Clark <michael@metaparadigm.com>
- *
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of the MIT license. See COPYING for details.
- *
- */
-
- /**
- * @file
- * @brief Do not use, json-c internal, may be changed or removed at any time.
- */
- #ifndef _json_object_private_h_
- #define _json_object_private_h_
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- struct json_object;
- #include "json_inttypes.h"
- #include "json_types.h"
-
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif /* HAVE_UNISTD_H */
-
- #ifdef _MSC_VER
- #include <BaseTsd.h>
- typedef SSIZE_T ssize_t;
- #endif
-
- /* json object int type, support extension*/
- typedef enum json_object_int_type
- {
- json_object_int_type_int64,
- json_object_int_type_uint64
- } json_object_int_type;
-
- struct json_object
- {
- enum json_type o_type;
- uint32_t _ref_count;
- json_object_to_json_string_fn *_to_json_string;
- struct printbuf *_pb;
- json_object_delete_fn *_user_delete;
- void *_userdata;
- // Actually longer, always malloc'd as some more-specific type.
- // The rest of a struct json_object_${o_type} follows
- };
-
- struct json_object_object
- {
- struct json_object base;
- struct lh_table *c_object;
- };
- struct json_object_array
- {
- struct json_object base;
- struct array_list *c_array;
- };
-
- struct json_object_boolean
- {
- struct json_object base;
- json_bool c_boolean;
- };
- struct json_object_double
- {
- struct json_object base;
- double c_double;
- };
- struct json_object_int
- {
- struct json_object base;
- enum json_object_int_type cint_type;
- union
- {
- int64_t c_int64;
- uint64_t c_uint64;
- } cint;
- };
- struct json_object_string
- {
- struct json_object base;
- ssize_t len; // Signed b/c negative lengths indicate data is a pointer
- // Consider adding an "alloc" field here, if json_object_set_string calls
- // to expand the length of a string are common operations to perform.
- union
- {
- char idata[1]; // Immediate data. Actually longer
- char *pdata; // Only when len < 0
- } c_string;
- };
-
- void _json_c_set_last_err(const char *err_fmt, ...);
-
- extern const char *json_hex_chars;
-
- struct json_pointer_get_result {
- struct json_object *parent;
- struct json_object *obj;
- union {
- const char *key;
- uint32_t index;
- } id;
- };
-
- int json_pointer_get_internal(struct json_object *obj, const char *path,
- struct json_pointer_get_result *res);
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|