Mon, 31 Mar 2025 19:39:42 +0200
complete JSON documentation
relates to #451
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # JSON |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
2 | |
1267 | 3 | The UCX JSON API allows [parsing](#parser) and [formatting](#writer) of JSON data. |
4 | ||
5 | The parser API is similar to the [properties](properties.h.md) parser, | |
6 | but - due to the nature of JSON - is not allocation-free. | |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
7 | |
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
8 | ## Parser |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
9 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
10 | ```C |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
11 | #include <cx/json.h> |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
12 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
13 | void cxJsonInit(CxJson *json, const CxAllocator *allocator); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
14 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
15 | void cxJsonReset(CxJson *json); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
16 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
17 | int cxJsonFilln(CxJson *json, const char *buf, size_t len); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
18 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
19 | int cxJsonFill(CxJson *json, AnyStr str); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
20 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
21 | CxJsonStatus cxJsonNext(CxJson *json, CxJsonValue **value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
22 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
23 | void cxJsonDestroy(CxJson *json); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
24 | ``` |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
25 | |
1268
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
26 | The first step is to initialize a `CxJson` structure with a call to `cxJsonInit()`, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
27 | specifying the allocator that shall be used for allocating values of type `CxJsonValue`. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
28 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
29 | Specifying `NULL` as `allocator` is allowed, in which case the `cxDefaultAllocator` will be used. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
30 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
31 | The actual parsing is an interleaving invocation of the `cxJsonFill()` (or `cxJsonFilln()`) and `cxJsonNext()` functions. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
32 | The `cxJsonFill()` function is a convenience function, that accepts UCX strings and normal zero-terminated C strings. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
33 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
34 | Calling `cxJsonNext()` will return with `CX_JSON_NO_ERROR` (= zero) for each JSON value that is successfully parsed, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
35 | and stores the pointer to the allocated value in the variable pointed to by `value`. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
36 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
37 | > The parser is capable of parsing multiple consecutive JSON values. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
38 | > If those values are not objects or arrays, they must, however, be separated by any whitespace character. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
39 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
40 | When all the data from the input buffer was successfully consumed, `cxJsonNext()` returns `CX_JSON_NO_DATA`. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
41 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
42 | If `cxJsonNext()` returns `CX_JSON_INCOMPLETE_DATA` it means that the input buffer is exhausted, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
43 | but the parsed input does not constitute a complete JSON value. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
44 | In that case, you can call `cxJsonFill()` again to add more data and continue with `cxJsonNext()`. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
45 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
46 | A complete list of all status codes can be seen [below](#list-of-status-codes). |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
47 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
48 | If you want to reuse a `CxJson` structure, you can call `cxJsonReset()`, even if the last operation was a failure. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
49 | Otherwise, you need to call `cxJsonDestroy()` when you are done with the parser. |
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
50 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
51 | ### List of Status Codes |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
52 | |
1258
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
53 | Below is a full list of status codes for `cxJsonNext()`. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
54 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
55 | | Status Code | Meaning | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
56 | |---------------------------------------|---------------------------------------------------------------------------------------------------| |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
57 | | CX_JSON_NO_ERROR | A value was successfully parsed. | | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
58 | | CX_JSON_NO_DATA | The input buffer does not contain more data. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
59 | | CX_JSON_INCOMPLETE_DATA | The input ends unexpectedly. Use `cxJsonFill()` to add more data before retrying. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
60 | | CX_JSON_NULL_DATA | The input buffer was never initialized. Probably you forgot to call `cxJsonFill()` at least once. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
61 | | CX_JSON_BUFFER_ALLOC_FAILED | More internal buffer was needed, but could not be allocated. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
62 | | CX_JSON_VALUE_ALLOC_FAILED | Allocating memory for a json value failed. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
63 | | CX_JSON_FORMAT_ERROR_NUMBER | A number value is incorrectly formatted. | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
64 | | CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN | The tokenizer found something unexpected, i.e. the JSON string contains a syntax error. | |
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
65 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
66 | ## Access Values |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
67 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
68 | ```C |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
69 | #include <cx/json.h> |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
70 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
71 | bool cxJsonIsObject(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
72 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
73 | bool cxJsonIsArray(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
74 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
75 | bool cxJsonIsString(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
76 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
77 | bool cxJsonIsNumber(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
78 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
79 | bool cxJsonIsInteger(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
80 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
81 | bool cxJsonIsLiteral(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
82 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
83 | bool cxJsonIsBool(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
84 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
85 | bool cxJsonIsTrue(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
86 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
87 | bool cxJsonIsFalse(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
88 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
89 | bool cxJsonIsNull(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
90 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
91 | char *cxJsonAsString(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
92 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
93 | cxstring cxJsonAsCxString(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
94 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
95 | cxmutstr cxJsonAsCxMutStr(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
96 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
97 | double cxJsonAsDouble(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
98 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
99 | int64_t cxJsonAsInteger(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
100 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
101 | bool cxJsonAsBool(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
102 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
103 | size_t cxJsonArrSize(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
104 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
105 | CxJsonValue *cxJsonArrGet(const CxJsonValue *value, size_t index); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
106 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
107 | CxJsonValue *cxJsonObjGet(const CxJsonValue *value, AnyStr name); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
108 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
109 | CxIterator cxJsonArrIter(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
110 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
111 | CxIterator cxJsonObjIter(const CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
112 | ``` |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
113 | |
1258
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
114 | The `cxJsonIsXYZ()` family functions check the type of the specified JSON value. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
115 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
116 | The JSON specification only defines numbers, therefore `cxJsonIsNumber()` returns true for both floating point and integer numbers. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
117 | On the other hand, `cxJsonIsInteger()` only returns true for integral numbers. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
118 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
119 | The function `cxJsonIsBool()` returns true if `cxJsonIsLiteral()` returns true, but `cxJsonIsNull()` does not. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
120 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
121 | > Since a literal can be `true`, `false`, or `null`, note carefully that `!cxJsonIsTrue(v)` |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
122 | > is in general _not_ equivalent to `cxJsonIsFalse(v)`. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
123 | > |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
124 | > Additionally, UCX does implement the Javascript concept of a "falsy" value, meaning that |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
125 | > `cxJsonIsFalse()` _only_ returns true, if the value is a literal `false`. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
126 | >{style="note"} |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
127 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
128 | The `cxJsonAsXYZ()` family of functions return the value with its corresponding C type. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
129 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
130 | The functions `cxJsonAsInteger()` and `cxJsonAsDouble()` can be used for any number value. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
131 | For example, if `cxJsonAsInteger()` is used on a non-integral number, a double-to-int conversion is performed. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
132 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
133 | The function `cxJsonArraySize()` returns the number of items in an array value, |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
134 | which can be accessed via index with `cxJsonArrGet()` or via an iterator created with `cxJsonArrIter()`. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
135 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
136 | The function `cxJsonObjGet()` returns the member in a JSON object associated with the specified `name`. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
137 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
138 | > Both `cxJsonArrGet()` and `cxJsonObjGet()` are safe regarding access to non-existing values. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
139 | > |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
140 | > When `cxJsonArrGet()` is used with an out-of-bounds index, or `cxJsonObjGet()` is used with a non-existent name, |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
141 | > they return a JSON value, that returns `false` for any `cxJsonIsXYZ()` function. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
142 | |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
143 | > If you don't have full control over the JSON data, you should always check the datatype of a value first, before accessing it. |
a12e102ff67f
add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents:
1257
diff
changeset
|
144 | >{style="note"} |
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
145 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
146 | ## Deallocate Memory |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
147 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
148 | ```C |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
149 | #include <cx/json.h> |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
150 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
151 | void cxJsonValueFree(CxJsonValue *value); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
152 | ``` |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
153 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
154 | Once a JSON value is not needed anymore, the memory can be deallocated with `cxJsonValueFree()`. |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
155 | Nested values are also recursively deallocated. |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
156 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
157 | > Make sure that you are not accidentally deallocating values that are still part of an object or array. |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
158 | > When deallocating the enclosing object/array, this will lead to a double-free. |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
159 | >{style="warning"} |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
160 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
161 | ## Create Objects |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
162 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
163 | ```C |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
164 | #include <cx/json.h> |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
165 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
166 | CxJsonValue* cxJsonCreateObj(const CxAllocator* allocator); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
167 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
168 | CxJsonValue* cxJsonCreateArr(const CxAllocator* allocator); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
169 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
170 | CxJsonValue* cxJsonCreateNumber( |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
171 | const CxAllocator* allocator, double num); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
172 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
173 | CxJsonValue* cxJsonCreateInteger( |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | const CxAllocator* allocator, int64_t num); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
175 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
176 | CxJsonValue* cxJsonCreateString(const CxAllocator* allocator, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
177 | const char *str); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
179 | CxJsonValue* cxJsonCreateCxString( |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
180 | const CxAllocator* allocator, cxstring str); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
181 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
182 | CxJsonValue* cxJsonCreateLiteral( |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
183 | const CxAllocator* allocator, CxJsonLiteral lit); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
184 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
185 | int cxJsonArrAddNumbers(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
186 | const double* num, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
187 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
188 | int cxJsonArrAddIntegers(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
189 | const int64_t* num, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
190 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
191 | int cxJsonArrAddStrings(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
192 | const char* const* str, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
193 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
194 | int cxJsonArrAddCxStrings(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
195 | const cxstring* str, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
196 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
197 | int cxJsonArrAddLiterals(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
198 | const CxJsonLiteral* lit, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
199 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
200 | int cxJsonArrAddValues(CxJsonValue* arr, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
201 | CxJsonValue* const* val, size_t count); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
202 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
203 | int cxJsonObjPut(CxJsonValue* obj, cxstring name, CxJsonValue* child); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
204 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
205 | CxJsonValue* cxJsonObjPutObj(CxJsonValue* obj, cxstring name); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
206 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
207 | CxJsonValue* cxJsonObjPutArr(CxJsonValue* obj, cxstring name); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
208 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
209 | CxJsonValue* cxJsonObjPutNumber(CxJsonValue* obj, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
210 | cxstring name, double num); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
211 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
212 | CxJsonValue* cxJsonObjPutInteger(CxJsonValue* obj, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
213 | cxstring name, int64_t num); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
214 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
215 | CxJsonValue* cxJsonObjPutString(CxJsonValue* obj, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
216 | cxstring name, const char* str); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
217 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
218 | CxJsonValue* cxJsonObjPutCxString(CxJsonValue* obj, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
219 | cxstring name, cxstring str); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
220 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
221 | CxJsonValue* cxJsonObjPutLiteral(CxJsonValue* obj, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
222 | cxstring name, CxJsonLiteral lit); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
223 | ``` |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
224 | |
1268
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
225 | The `cxJsonCreateXY()`-family of functions can be used to create JSON values which are allocated by the specified `allocator`. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
226 | If you specify `NULL` as allocator, the `cxDefaultAllocator` is used. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
227 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
228 | If you want to add created values to a JSON array or JSON object, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
229 | you can use `cxJsonArrAddValues()` or `cxJsonObjPut()`, respectively. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
230 | However, it is usually more convenient to use one of the other functions, as they automatically create the JSON value for. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
231 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
232 | ```C |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
233 | #include <cx/json.h> |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
234 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
235 | CxJsonValue* arr = cxJsonCreateArr(NULL); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
236 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
237 | // this is equivalent... |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
238 | CxJsonValue* x = cxJsonCreateInteger(NULL, 47); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
239 | CxJsonValue* y = cxJsonCreateInteger(NULL, 11); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
240 | cxJsonArrAddValues(arr, (CxJsonValue*[]){x, y}, 2); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
241 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
242 | // ... to this |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
243 | cxJsonArrAddIntegers(arr, (int64_t[]){47, 11}, 2); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
244 | ``` |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
245 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
246 | The following example shows how to construct a complete JSON object. |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
247 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
248 | ```C |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
249 | CxJsonValue *obj = cxJsonCreateObj(NULL); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
250 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
251 | cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
252 | cxJsonObjPutInteger(obj, CX_STR("int"), 47); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
253 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
254 | CxJsonValue *strings = cxJsonObjPutArr(obj, CX_STR("strings")); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
255 | cxJsonArrAddStrings(strings, (const char*[]) {"hello", "world"}, 2); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
256 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
257 | CxJsonValue *nested = cxJsonObjPutObj(obj, CX_STR("nested")); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
258 | CxJsonValue *objects = cxJsonObjPutArr(nested, CX_STR("objects")); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
259 | CxJsonValue *obj_in_arr[2] = { |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
260 | cxJsonCreateObj(NULL), |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
261 | cxJsonCreateObj(NULL), |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
262 | }; |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
263 | cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name1"), 1); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
264 | cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name2"), 3); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
265 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
266 | cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name2"), 7); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
267 | cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name1"), 3); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
268 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
269 | cxJsonArrAddValues(objects, obj_in_arr, 2); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
270 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
271 | cxJsonArrAddNumbers(cxJsonObjPutArr(nested, CX_STR("floats")), |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
272 | (double[]){3.1415, 47.11, 8.15}, 3); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
273 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
274 | cxJsonArrAddLiterals(cxJsonObjPutArr(nested, CX_STR("literals")), |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
275 | (CxJsonLiteral[]){CX_JSON_TRUE, CX_JSON_NULL, CX_JSON_FALSE}, 3); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
276 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
277 | CxJsonValue *ints = cxJsonObjPutArr(nested, CX_STR("ints")); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
278 | cxJsonArrAddIntegers(ints, (int64_t[]){4, 8, 15}, 3); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
279 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
280 | CxJsonValue *nested_array = cxJsonCreateArr(NULL); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
281 | cxJsonArrAddValues(ints, &nested_array, 1); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
282 | cxJsonArrAddIntegers(nested_array, (int64_t[]){16, 23}, 2); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
283 | cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
284 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
285 | CxJsonWriter w = cxJsonWriterPretty(true); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
286 | cxJsonWrite(stdout, obj, (cx_write_func) fwrite, &w); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
287 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
288 | cxJsonValueFree(obj); |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
289 | ``` |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
290 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
291 | The above code writes the following output to `stdout`: |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
292 | |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
293 | ```JSON |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
294 | { |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
295 | "bool": false, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
296 | "int": 47, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
297 | "nested": { |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
298 | "floats": [3.1415, 47.11, 8.15], |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
299 | "ints": [4, 8, 15, [16, 23], 42], |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
300 | "literals": [true, null, false], |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
301 | "objects": [{ |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
302 | "name1": 1, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
303 | "name2": 3 |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
304 | }, { |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
305 | "name1": 3, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
306 | "name2": 7 |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
307 | }] |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
308 | }, |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
309 | "strings": ["hello", "world"] |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
310 | } |
a84403b0a503
complete JSON documentation
Mike Becker <universe@uap-core.de>
parents:
1267
diff
changeset
|
311 | ``` |
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
312 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
313 | ## Writer |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
314 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
315 | ```C |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
316 | #include <cx/json.h> |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
317 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
318 | typedef struct cx_json_writer_s { |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
319 | bool pretty; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
320 | bool sort_members; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
321 | uint8_t frac_max_digits; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
322 | bool indent_space; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
323 | uint8_t indent; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
324 | bool escape_slash; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
325 | } CxJsonWriter; |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
326 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
327 | CxJsonWriter cxJsonWriterCompact(void); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
328 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
329 | CxJsonWriter cxJsonWriterPretty(bool use_spaces); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
330 | |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
331 | int cxJsonWrite(void* target, const CxJsonValue* value, |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
332 | cx_write_func wfunc, const CxJsonWriter* settings); |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
333 | ``` |
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
334 | |
1267 | 335 | A JSON value can be formatted with the `cxJsonWrite()` function. |
336 | ||
337 | The `target` can be a stream, a UCX [buffer](buffer.h.md), or anything else that can be written to with a write function. | |
338 | The behavior of the function is controlled via a `CxJsonWriter` struct. | |
339 | With the functions `cxJsonWriterCompact()` and `cxJsonWriterPretty()` you can create default settings, | |
340 | which you may modify to suit your needs. | |
341 | ||
342 | | Setting | Compact Default | Pretty Default | Description | | |
343 | |-------------------|-----------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |
344 | | `pretty` | `false` | `true` | If true, the JSON will be formatted with line breaks and tabs or spaces. If false, output is as compact as possible without extra characters. | | |
345 | | `sort_members` | `true` | `true` | If false members are written in the order in which they were added. If true, they are sorted lexicographically. | | |
346 | | `frac_max_digits` | 6 | 6 | The maximum number of fractional digits in a number value. | | |
347 | | `indent_space` | ignored | depends on `use_spaces` argument | If true, use spaces for indentation, otherwise use tabs. | | |
348 | | `indent` | ignored | 4 | If `indent_space` is `true`, this is the number of spaces per tab. Ignored otherwise. | | |
349 | | `escape_slash` | `false` | `false` | If `true`, the slash character (a.k.a forward solidus: `/`) is also escaped. This is usually only needed when you want to use JSON as part of an HTML attribute. | | |
350 | ||
1257
946cadf95ea4
define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
351 | |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
352 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
353 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
354 | <a href="https://ucx.sourceforge.io/api/json_8h.html">json.h</a> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
355 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
356 | </seealso> |