| 26 TODO: document |
26 TODO: document |
| 27 </warning> |
27 </warning> |
| 28 |
28 |
| 29 ### List of Status Codes |
29 ### List of Status Codes |
| 30 |
30 |
| 31 <!-- |
31 Below is a full list of status codes for `cxJsonNext()`. |
| 32 /** |
32 |
| 33 * Everything is fine. |
33 | Status Code | Meaning | |
| 34 */ |
34 |---------------------------------------|---------------------------------------------------------------------------------------------------| |
| 35 CX_JSON_NO_ERROR, |
35 | CX_JSON_NO_ERROR | A value was successfully parsed. | | |
| 36 /** |
36 | CX_JSON_NO_DATA | The input buffer does not contain more data. | |
| 37 * The input buffer does not contain more data. |
37 | CX_JSON_INCOMPLETE_DATA | The input ends unexpectedly. Use `cxJsonFill()` to add more data before retrying. | |
| 38 */ |
38 | CX_JSON_NULL_DATA | The input buffer was never initialized. Probably you forgot to call `cxJsonFill()` at least once. | |
| 39 CX_JSON_NO_DATA, |
39 | CX_JSON_BUFFER_ALLOC_FAILED | More internal buffer was needed, but could not be allocated. | |
| 40 /** |
40 | CX_JSON_VALUE_ALLOC_FAILED | Allocating memory for a json value failed. | |
| 41 * The input ends unexpectedly. |
41 | CX_JSON_FORMAT_ERROR_NUMBER | A number value is incorrectly formatted. | |
| 42 * |
42 | CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN | The tokenizer found something unexpected, i.e. the JSON string contains a syntax error. | |
| 43 * Refill the buffer with cxJsonFill() to complete the json data. |
|
| 44 */ |
|
| 45 CX_JSON_INCOMPLETE_DATA, |
|
| 46 /** |
|
| 47 * Not used as a status and never returned by any function. |
|
| 48 * |
|
| 49 * You can use this enumerator to check for all "good" status results |
|
| 50 * by checking if the status is less than @c CX_JSON_OK. |
|
| 51 * |
|
| 52 * A "good" status means, that you can refill data and continue parsing. |
|
| 53 */ |
|
| 54 CX_JSON_OK, |
|
| 55 /** |
|
| 56 * The input buffer has never been filled. |
|
| 57 */ |
|
| 58 CX_JSON_NULL_DATA, |
|
| 59 /** |
|
| 60 * Allocating memory for the internal buffer failed. |
|
| 61 */ |
|
| 62 CX_JSON_BUFFER_ALLOC_FAILED, |
|
| 63 /** |
|
| 64 * Allocating memory for a json value failed. |
|
| 65 */ |
|
| 66 CX_JSON_VALUE_ALLOC_FAILED, |
|
| 67 /** |
|
| 68 * A number value is incorrectly formatted. |
|
| 69 */ |
|
| 70 CX_JSON_FORMAT_ERROR_NUMBER, |
|
| 71 /** |
|
| 72 * The tokenizer found something unexpected. |
|
| 73 */ |
|
| 74 CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN |
|
| 75 --> |
|
| 76 |
43 |
| 77 ## Access Values |
44 ## Access Values |
| 78 |
45 |
| 79 ```C |
46 ```C |
| 80 #include <cx/json.h> |
47 #include <cx/json.h> |
| 120 CxIterator cxJsonArrIter(const CxJsonValue *value); |
87 CxIterator cxJsonArrIter(const CxJsonValue *value); |
| 121 |
88 |
| 122 CxIterator cxJsonObjIter(const CxJsonValue *value); |
89 CxIterator cxJsonObjIter(const CxJsonValue *value); |
| 123 ``` |
90 ``` |
| 124 |
91 |
| 125 <warning> |
92 The `cxJsonIsXYZ()` family functions check the type of the specified JSON value. |
| 126 TODO: document |
93 |
| 127 </warning> |
94 The JSON specification only defines numbers, therefore `cxJsonIsNumber()` returns true for both floating point and integer numbers. |
| |
95 On the other hand, `cxJsonIsInteger()` only returns true for integral numbers. |
| |
96 |
| |
97 The function `cxJsonIsBool()` returns true if `cxJsonIsLiteral()` returns true, but `cxJsonIsNull()` does not. |
| |
98 |
| |
99 > Since a literal can be `true`, `false`, or `null`, note carefully that `!cxJsonIsTrue(v)` |
| |
100 > is in general _not_ equivalent to `cxJsonIsFalse(v)`. |
| |
101 > |
| |
102 > Additionally, UCX does implement the Javascript concept of a "falsy" value, meaning that |
| |
103 > `cxJsonIsFalse()` _only_ returns true, if the value is a literal `false`. |
| |
104 >{style="note"} |
| |
105 |
| |
106 The `cxJsonAsXYZ()` family of functions return the value with its corresponding C type. |
| |
107 |
| |
108 The functions `cxJsonAsInteger()` and `cxJsonAsDouble()` can be used for any number value. |
| |
109 For example, if `cxJsonAsInteger()` is used on a non-integral number, a double-to-int conversion is performed. |
| |
110 |
| |
111 The function `cxJsonArraySize()` returns the number of items in an array value, |
| |
112 which can be accessed via index with `cxJsonArrGet()` or via an iterator created with `cxJsonArrIter()`. |
| |
113 |
| |
114 The function `cxJsonObjGet()` returns the member in a JSON object associated with the specified `name`. |
| |
115 |
| |
116 > Both `cxJsonArrGet()` and `cxJsonObjGet()` are safe regarding access to non-existing values. |
| |
117 > |
| |
118 > When `cxJsonArrGet()` is used with an out-of-bounds index, or `cxJsonObjGet()` is used with a non-existent name, |
| |
119 > they return a JSON value, that returns `false` for any `cxJsonIsXYZ()` function. |
| |
120 |
| |
121 > If you don't have full control over the JSON data, you should always check the datatype of a value first, before accessing it. |
| |
122 >{style="note"} |
| 128 |
123 |
| 129 ## Deallocate Memory |
124 ## Deallocate Memory |
| 130 |
125 |
| 131 ```C |
126 ```C |
| 132 #include <cx/json.h> |
127 #include <cx/json.h> |