X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=doc%2Fapiref.rst;h=bf22466ae4bacbc1458e93df3f4b1ef5df52a3d5;hb=95a468cebb450ed779db90ca8c5805ffa2c93370;hp=d6904eb90943cd2153bdd60352a1a8aa971c0926;hpb=76999799ed675a8d6922a8f7c61cf1712f6f3d1f;p=jansson.git diff --git a/doc/apiref.rst b/doc/apiref.rst index d6904eb..bf22466 100644 --- a/doc/apiref.rst +++ b/doc/apiref.rst @@ -1,3 +1,5 @@ +.. _apiref: + ************* API Reference ************* @@ -113,6 +115,8 @@ functions: and false for values of other types and for *NULL*. +.. _apiref-reference-count: + Reference Count --------------- @@ -159,6 +163,37 @@ will return a new or borrowed reference or steal a reference to its argument. +Circular References +------------------- + +A circular reference is created when an object or an array is, +directly or indirectly, inserted inside itself. The direct case is +simple:: + + json_t *obj = json_object(); + json_object_set(obj, "foo", obj); + +Jansson will refuse to do this, and :cfunc:`json_object_set()` (and +all the other such functions for objects and arrays) will return with +an error status. The indirect case is the dangerous one:: + + json_t *arr1 = json_array(), *arr2 = json_array(); + json_array_append(arr1, arr2); + json_array_append(arr2, arr1); + +In this example, the array ``arr2`` is contained in the array +``arr1``, and vice versa. Jansson cannot check for this kind of +indirect circular references without a performance hit, so it's up to +the user to avoid them. + +If a circular reference is created, the memory consumed by the values +cannot be freed by :cfunc:`json_decref()`. The reference counts never +drops to zero because the values are keeping the circular reference to +themselves. Moreover, trying to encode the values with any of the +encoding functions will fail. The encoder detects circular references +and returns an error status. + + True, False and Null ==================== @@ -194,6 +229,16 @@ String Returns a new JSON string, or *NULL* on error. *value* must be a valid UTF-8 encoded Unicode string. +.. cfunction:: json_t *json_string_nocheck(const char *value) + + .. refcounting:: new + + Like :cfunc:`json_string`, but doesn't check that *value* is valid + UTF-8. Use this function only if you are certain that this really + is the case (e.g. you have already checked it by other means). + + .. versionadded:: 1.2 + .. cfunction:: const char *json_string_value(const json_t *string) Returns the associated value of *string* as a null terminated UTF-8 @@ -207,6 +252,15 @@ String .. versionadded:: 1.1 +.. cfunction:: int json_string_set_nocheck(const json_t *string, const char *value) + + Like :cfunc:`json_string_set`, but doesn't check that *value* is + valid UTF-8. Use this function only if you are certain that this + really is the case (e.g. you have already checked it by other + means). + + .. versionadded:: 1.2 + Number ====== @@ -385,6 +439,15 @@ Unicode string and the value is any JSON value. already is a value for *key*, it is replaced by the new value. Returns 0 on success and -1 on error. +.. cfunction:: int json_object_set_nocheck(json_t *object, const char *key, json_t *value) + + Like :cfunc:`json_object_set`, but doesn't check that *key* is + valid UTF-8. Use this function only if you are certain that this + really is the case (e.g. you have already checked it by other + means). + + .. versionadded:: 1.2 + .. cfunction:: int json_object_set_new(json_t *object, const char *key, json_t *value) Like :cfunc:`json_object_set()` but steals the reference to @@ -393,6 +456,15 @@ Unicode string and the value is any JSON value. .. versionadded:: 1.1 +.. cfunction:: int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value) + + Like :cfunc:`json_object_set_new`, but doesn't check that *key* is + valid UTF-8. Use this function only if you are certain that this + really is the case (e.g. you have already checked it by other + means). + + .. versionadded:: 1.2 + .. cfunction:: int json_object_del(json_t *object, const char *key) Delete *key* from *object* if it exists. Returns 0 on success, or @@ -459,16 +531,44 @@ This sections describes the functions that can be used to encode values to JSON. Only objects and arrays can be encoded, since they are the only valid "root" values of a JSON text. +By default, the output has no newlines, and spaces are used between +array and object elements for a readable output. This behavior can be +altered by using the ``JSON_INDENT`` and ``JSON_COMPACT`` flags +described below. A newline is never appended to the end of the encoded +JSON data. + Each function takes a *flags* parameter that controls some aspects of how the data is encoded. Its default value is 0. The following macros can be ORed together to obtain *flags*. ``JSON_INDENT(n)`` - Pretty-print the result, indenting arrays and objects by *n* - spaces. The valid range for *n* is between 0 and 255, other values - result in an undefined output. If ``JSON_INDENT`` is not used or - *n* is 0, no pretty-printing is done and the result is a compact - representation. + Pretty-print the result, using newlines between array and object + items, and indenting with *n* spaces. The valid range for *n* is + between 0 and 255, other values result in an undefined output. If + ``JSON_INDENT`` is not used or *n* is 0, no newlines are inserted + between array and object items. + +``JSON_COMPACT`` + This flag enables a compact representation, i.e. sets the separator + between array and object items to ``","`` and between object keys + and values to ``":"``. Without this flag, the corresponding + separators are ``", "`` and ``": "`` for more readable output. + + .. versionadded:: 1.2 + +``JSON_ENSURE_ASCII`` + If this flag is used, the output is guaranteed to consist only of + ASCII characters. This is achived by escaping all Unicode + characters outside the ASCII range. + + .. versionadded:: 1.2 + +``JSON_SORT_KEYS`` + If this flag is used, all the objects in output are sorted by key. + This is useful e.g. if two JSON texts are diffed or visually + compared. + + .. versionadded:: 1.2 The following functions perform the actual JSON encoding. The result is in UTF-8. @@ -483,6 +583,9 @@ is in UTF-8. Write the JSON representation of *root* to the stream *output*. *flags* is described above. Returns 0 on success and -1 on error. + If an error occurs, something may have already been written to + *output*. In this case, the output is undefined and most likely not + valid JSON. .. cfunction:: int json_dump_file(const json_t *json, const char *path, unsigned long flags) @@ -570,3 +673,43 @@ The following functions perform the actual JSON decoding. object it contains, or *NULL* on error, in which case *error* is filled with information about the error. See above for discussion on the *error* parameter. + + +Equality +======== + +Testing for equality of two JSON values cannot, in general, be +achieved using the ``==`` operator. Equality in the terms of the +``==`` operator states that the two :ctype:`json_t` pointers point to +exactly the same JSON value. However, two JSON values can be equal not +only if they are exactly the same value, but also if they have equal +"contents": + +* Two integer or real values are equal if their contained numeric + values are equal. An integer value is never equal to a real value, + though. + +* Two strings are equal if their contained UTF-8 strings are equal. + +* Two arrays are equal if they have the same number of elements and + each element in the first array is equal to the corresponding + element in the second array. + +* Two objects are equal if they have exactly the same keys and the + value for each key in the first object is equal to the value of the + corresponding key in the second object. + +* Two true, false or null values have no "contents", so they are equal + if their types are equal. (Because these values are singletons, + their equality can actually be tested with ``==``.) + +The following function can be used to test whether two JSON values are +equal. + +.. cfunction:: int json_equal(json_t *value1, json_t *value2) + + Returns 1 if *value1* and *value2* are equal, as defined above. + Returns 0 if they are inequal or one or both of the pointers are + *NULL*. + + .. versionadded:: 1.2