2 |
2 |
3 <warning> |
3 <warning> |
4 New Feature - will be documented soon! |
4 New Feature - will be documented soon! |
5 </warning> |
5 </warning> |
6 |
6 |
|
7 ## Parser |
|
8 |
|
9 ```C |
|
10 #include <cx/json.h> |
|
11 |
|
12 void cxJsonInit(CxJson *json, const CxAllocator *allocator); |
|
13 |
|
14 void cxJsonReset(CxJson *json); |
|
15 |
|
16 int cxJsonFilln(CxJson *json, const char *buf, size_t len); |
|
17 |
|
18 int cxJsonFill(CxJson *json, AnyStr str); |
|
19 |
|
20 CxJsonStatus cxJsonNext(CxJson *json, CxJsonValue **value); |
|
21 |
|
22 void cxJsonDestroy(CxJson *json); |
|
23 ``` |
|
24 |
|
25 <warning> |
|
26 TODO: document |
|
27 </warning> |
|
28 |
|
29 ### List of Status Codes |
|
30 |
7 <!-- |
31 <!-- |
8 ## Undocumented Symbols (TODO) |
32 /** |
9 ### cxJsonArrAddCxStrings |
33 * Everything is fine. |
10 ### cxJsonArrAddIntegers |
34 */ |
11 ### cxJsonArrAddLiterals |
35 CX_JSON_NO_ERROR, |
12 ### cxJsonArrAddNumbers |
36 /** |
13 ### cxJsonArrAddStrings |
37 * The input buffer does not contain more data. |
14 ### cxJsonArrAddValues |
38 */ |
15 ### cxJsonArrGet |
39 CX_JSON_NO_DATA, |
16 ### cxJsonArrIter |
40 /** |
17 ### cxJsonCreateArr |
41 * The input ends unexpectedly. |
18 ### cxJsonCreateCxString |
42 * |
19 ### cxJsonCreateInteger |
43 * Refill the buffer with cxJsonFill() to complete the json data. |
20 ### cxJsonCreateLiteral |
44 */ |
21 ### cxJsonCreateNumber |
45 CX_JSON_INCOMPLETE_DATA, |
22 ### cxJsonCreateObj |
46 /** |
23 ### cxJsonCreateString |
47 * Not used as a status and never returned by any function. |
24 ### cxJsonDestroy |
48 * |
25 ### cxJsonFilln |
49 * You can use this enumerator to check for all "good" status results |
26 ### cxJsonInit |
50 * by checking if the status is less than @c CX_JSON_OK. |
27 ### cxJsonNext |
51 * |
28 ### cx_json_obj_get_cxstr |
52 * A "good" status means, that you can refill data and continue parsing. |
29 ### cxJsonObjIter |
53 */ |
30 ### cxJsonObjPut |
54 CX_JSON_OK, |
31 ### cxJsonObjPutArr |
55 /** |
32 ### cxJsonObjPutCxString |
56 * The input buffer has never been filled. |
33 ### cxJsonObjPutInteger |
57 */ |
34 ### cxJsonObjPutLiteral |
58 CX_JSON_NULL_DATA, |
35 ### cxJsonObjPutNumber |
59 /** |
36 ### cxJsonObjPutObj |
60 * Allocating memory for the internal buffer failed. |
37 ### cxJsonObjPutString |
61 */ |
38 ### cxJsonValueFree |
62 CX_JSON_BUFFER_ALLOC_FAILED, |
39 ### cxJsonWrite |
63 /** |
40 ### cxJsonWriterCompact |
64 * Allocating memory for a json value failed. |
41 ### cx_json_write_rec |
65 */ |
42 ### cxJsonWriterPretty |
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 |
43 --> |
75 --> |
|
76 |
|
77 ## Access Values |
|
78 |
|
79 ```C |
|
80 #include <cx/json.h> |
|
81 |
|
82 bool cxJsonIsObject(const CxJsonValue *value); |
|
83 |
|
84 bool cxJsonIsArray(const CxJsonValue *value); |
|
85 |
|
86 bool cxJsonIsString(const CxJsonValue *value); |
|
87 |
|
88 bool cxJsonIsNumber(const CxJsonValue *value); |
|
89 |
|
90 bool cxJsonIsInteger(const CxJsonValue *value); |
|
91 |
|
92 bool cxJsonIsLiteral(const CxJsonValue *value); |
|
93 |
|
94 bool cxJsonIsBool(const CxJsonValue *value); |
|
95 |
|
96 bool cxJsonIsTrue(const CxJsonValue *value); |
|
97 |
|
98 bool cxJsonIsFalse(const CxJsonValue *value); |
|
99 |
|
100 bool cxJsonIsNull(const CxJsonValue *value); |
|
101 |
|
102 char *cxJsonAsString(const CxJsonValue *value); |
|
103 |
|
104 cxstring cxJsonAsCxString(const CxJsonValue *value); |
|
105 |
|
106 cxmutstr cxJsonAsCxMutStr(const CxJsonValue *value); |
|
107 |
|
108 double cxJsonAsDouble(const CxJsonValue *value); |
|
109 |
|
110 int64_t cxJsonAsInteger(const CxJsonValue *value); |
|
111 |
|
112 bool cxJsonAsBool(const CxJsonValue *value); |
|
113 |
|
114 size_t cxJsonArrSize(const CxJsonValue *value); |
|
115 |
|
116 CxJsonValue *cxJsonArrGet(const CxJsonValue *value, size_t index); |
|
117 |
|
118 CxJsonValue *cxJsonObjGet(const CxJsonValue *value, AnyStr name); |
|
119 |
|
120 CxIterator cxJsonArrIter(const CxJsonValue *value); |
|
121 |
|
122 CxIterator cxJsonObjIter(const CxJsonValue *value); |
|
123 ``` |
|
124 |
|
125 <warning> |
|
126 TODO: document |
|
127 </warning> |
|
128 |
|
129 ## Deallocate Memory |
|
130 |
|
131 ```C |
|
132 #include <cx/json.h> |
|
133 |
|
134 void cxJsonValueFree(CxJsonValue *value); |
|
135 ``` |
|
136 |
|
137 Once a JSON value is not needed anymore, the memory can be deallocated with `cxJsonValueFree()`. |
|
138 Nested values are also recursively deallocated. |
|
139 |
|
140 > Make sure that you are not accidentally deallocating values that are still part of an object or array. |
|
141 > When deallocating the enclosing object/array, this will lead to a double-free. |
|
142 >{style="warning"} |
|
143 |
|
144 ## Create Objects |
|
145 |
|
146 ```C |
|
147 #include <cx/json.h> |
|
148 |
|
149 CxJsonValue* cxJsonCreateObj(const CxAllocator* allocator); |
|
150 |
|
151 CxJsonValue* cxJsonCreateArr(const CxAllocator* allocator); |
|
152 |
|
153 CxJsonValue* cxJsonCreateNumber( |
|
154 const CxAllocator* allocator, double num); |
|
155 |
|
156 CxJsonValue* cxJsonCreateInteger( |
|
157 const CxAllocator* allocator, int64_t num); |
|
158 |
|
159 CxJsonValue* cxJsonCreateString(const CxAllocator* allocator, |
|
160 const char *str); |
|
161 |
|
162 CxJsonValue* cxJsonCreateCxString( |
|
163 const CxAllocator* allocator, cxstring str); |
|
164 |
|
165 CxJsonValue* cxJsonCreateLiteral( |
|
166 const CxAllocator* allocator, CxJsonLiteral lit); |
|
167 |
|
168 int cxJsonArrAddNumbers(CxJsonValue* arr, |
|
169 const double* num, size_t count); |
|
170 |
|
171 int cxJsonArrAddIntegers(CxJsonValue* arr, |
|
172 const int64_t* num, size_t count); |
|
173 |
|
174 int cxJsonArrAddStrings(CxJsonValue* arr, |
|
175 const char* const* str, size_t count); |
|
176 |
|
177 int cxJsonArrAddCxStrings(CxJsonValue* arr, |
|
178 const cxstring* str, size_t count); |
|
179 |
|
180 int cxJsonArrAddLiterals(CxJsonValue* arr, |
|
181 const CxJsonLiteral* lit, size_t count); |
|
182 |
|
183 int cxJsonArrAddValues(CxJsonValue* arr, |
|
184 CxJsonValue* const* val, size_t count); |
|
185 |
|
186 int cxJsonObjPut(CxJsonValue* obj, cxstring name, CxJsonValue* child); |
|
187 |
|
188 CxJsonValue* cxJsonObjPutObj(CxJsonValue* obj, cxstring name); |
|
189 |
|
190 CxJsonValue* cxJsonObjPutArr(CxJsonValue* obj, cxstring name); |
|
191 |
|
192 CxJsonValue* cxJsonObjPutNumber(CxJsonValue* obj, |
|
193 cxstring name, double num); |
|
194 |
|
195 CxJsonValue* cxJsonObjPutInteger(CxJsonValue* obj, |
|
196 cxstring name, int64_t num); |
|
197 |
|
198 CxJsonValue* cxJsonObjPutString(CxJsonValue* obj, |
|
199 cxstring name, const char* str); |
|
200 |
|
201 CxJsonValue* cxJsonObjPutCxString(CxJsonValue* obj, |
|
202 cxstring name, cxstring str); |
|
203 |
|
204 CxJsonValue* cxJsonObjPutLiteral(CxJsonValue* obj, |
|
205 cxstring name, CxJsonLiteral lit); |
|
206 ``` |
|
207 |
|
208 <warning> |
|
209 TODO: document |
|
210 </warning> |
|
211 |
|
212 ## Writer |
|
213 |
|
214 ```C |
|
215 #include <cx/json.h> |
|
216 |
|
217 typedef struct cx_json_writer_s { |
|
218 bool pretty; |
|
219 bool sort_members; |
|
220 uint8_t frac_max_digits; |
|
221 bool indent_space; |
|
222 uint8_t indent; |
|
223 bool escape_slash; |
|
224 } CxJsonWriter; |
|
225 |
|
226 CxJsonWriter cxJsonWriterCompact(void); |
|
227 |
|
228 CxJsonWriter cxJsonWriterPretty(bool use_spaces); |
|
229 |
|
230 int cxJsonWrite(void* target, const CxJsonValue* value, |
|
231 cx_write_func wfunc, const CxJsonWriter* settings); |
|
232 ``` |
|
233 |
|
234 <warning> |
|
235 TODO: document |
|
236 </warning> |
|
237 |
44 <seealso> |
238 <seealso> |
45 <category ref="apidoc"> |
239 <category ref="apidoc"> |
46 <a href="https://ucx.sourceforge.io/api/json_8h.html">json.h</a> |
240 <a href="https://ucx.sourceforge.io/api/json_8h.html">json.h</a> |
47 </category> |
241 </category> |
48 </seealso> |
242 </seealso> |