Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
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> |