docs/Writerside/topics/json.h.md

Sat, 13 Dec 2025 15:16:25 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 13 Dec 2025 15:16:25 +0100
changeset 1586
7f1cadc3ebc1
parent 1583
97fc8c55aeea
child 1594
4b9537f93239
permissions
-rw-r--r--

add json compare tests

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
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
3 The UCX JSON API allows [parsing](#parser) and [formatting](#writer) of JSON data.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
4
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
5 The parser API is similar to the [properties](properties.h.md) parser,
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
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
1553
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
10 The following listing shows the JSON parser API.
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
11
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
12 > To simplify documentation, we introduce the pseudo-type `AnyStr` with the meaning that
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
13 > any UCX string and any C string are supported.
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
14 > The implementation is actually hidden behind a macro which uses `cx_strcast()` to guarantee compatibility.
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
15 {style="note"}
7c46531efd52 fix the note about AnyStr and add it to the files where it was missing
Mike Becker <universe@uap-core.de>
parents: 1550
diff changeset
16
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
17 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
18 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
19
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
20 void cxJsonInit(CxJson *json, const CxAllocator *allocator);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
21
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
22 void cxJsonReset(CxJson *json);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
23
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
24 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
25
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
26 int cxJsonFill(CxJson *json, AnyStr str);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
27
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
28 CxJsonStatus cxJsonNext(CxJson *json, CxJsonValue **value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
29
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
30 void cxJsonDestroy(CxJson *json);
1556
afdaa70034f8 add cxJsonFromString() - resolves #771
Mike Becker <universe@uap-core.de>
parents: 1553
diff changeset
31
afdaa70034f8 add cxJsonFromString() - resolves #771
Mike Becker <universe@uap-core.de>
parents: 1553
diff changeset
32 CxJsonStatus cxJsonFromString(const CxAllocator *allocator,
afdaa70034f8 add cxJsonFromString() - resolves #771
Mike Becker <universe@uap-core.de>
parents: 1553
diff changeset
33 AnyStr str, CxJsonValue **value);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
34 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
35
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
36 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
37 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
38
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
39 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
40
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
41 The actual parsing is an interleaving invocation of the `cxJsonFill()` (or `cxJsonFilln()`) and `cxJsonNext()` functions.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1339
diff changeset
42 The `cxJsonFill()` function is a convenience function that accepts UCX strings and normal zero-terminated C strings.
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
43
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
44 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
45 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
46
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
47 > The parser is capable of parsing multiple consecutive JSON values.
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
48 > 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
49
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
50 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
51
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
52 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
53 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
54 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
55
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
56 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
57
1566
2ebbcb38986d fix that the docu does not explain that you must reset a parser that ran into an error
Mike Becker <universe@uap-core.de>
parents: 1556
diff changeset
58 If you want to reuse a `CxJson` structure, you can call `cxJsonReset()`.
2ebbcb38986d fix that the docu does not explain that you must reset a parser that ran into an error
Mike Becker <universe@uap-core.de>
parents: 1556
diff changeset
59 In particular, you _must_ reset the parser when the last operation was a failure.
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
60 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
61
1556
afdaa70034f8 add cxJsonFromString() - resolves #771
Mike Becker <universe@uap-core.de>
parents: 1553
diff changeset
62 The function `cxJsonFromString()` combines the above procedure.
afdaa70034f8 add cxJsonFromString() - resolves #771
Mike Becker <universe@uap-core.de>
parents: 1553
diff changeset
63
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
64 ### List of Status Codes
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
65
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
66 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
67
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
68 | Status Code | Meaning |
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
69 |---------------------------------------|---------------------------------------------------------------------------------------------------|
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
70 | 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
71 | 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
72 | 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
73 | 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
74 | 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
75 | 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
76 | 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
77 | 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
78
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79 ## Access Values
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 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
83
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
84 bool cxJsonIsObject(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
85
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 bool cxJsonIsArray(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
87
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
88 bool cxJsonIsString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
89
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
90 bool cxJsonIsNumber(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
91
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
92 bool cxJsonIsInteger(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
93
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
94 bool cxJsonIsLiteral(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
95
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
96 bool cxJsonIsBool(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
97
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
98 bool cxJsonIsTrue(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
99
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
100 bool cxJsonIsFalse(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
101
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
102 bool cxJsonIsNull(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
103
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 char *cxJsonAsString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
105
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
106 cxstring cxJsonAsCxString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
107
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
108 cxmutstr cxJsonAsCxMutStr(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
109
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
110 double cxJsonAsDouble(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
111
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112 int64_t cxJsonAsInteger(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
114 bool cxJsonAsBool(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
115
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
116 size_t cxJsonArrSize(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
117
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
118 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
119
1339
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
120 CxJsonValue *cxJsonArrRemove(const CxJsonValue *value, size_t index);
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
121
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
122 size_t cxJsonObjSize(const CxJsonValue *value);
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
123
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
124 CxJsonValue *cxJsonObjGet(const CxJsonValue *value, AnyStr name);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
125
1339
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
126 CxJsonValue *cxJsonObjRemove(const CxJsonValue *value, AnyStr name);
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
127
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
128 CxIterator cxJsonArrIter(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
129
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
130 CxIterator cxJsonObjIter(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
131 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
132
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
133 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
134
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1339
diff changeset
135 The JSON specification only defines numbers, therefore `cxJsonIsNumber()` returns true for both floating-point and integer numbers.
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
136 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
137
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
138 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
139
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
140 > 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
141 > 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
142 >
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1339
diff changeset
143 > Additionally, UCX does implement the JavaScript concept of a "falsy" value, meaning that
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
144 > `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
145 >{style="note"}
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
146
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
147 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
148
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
149 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
150 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
151
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
152 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
153 which can be accessed via index with `cxJsonArrGet()` or via an iterator created with `cxJsonArrIter()`.
1339
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
154 An element can be removed from an array with `cxJsonArrRemove()`.
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
155
1339
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
156 The function `cxJsonObjGet()` returns the member in a JSON object associated with the specified `name`.
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
157 To remove a member, use `cxJsonObjRemove()`.
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
158
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
159 > 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
160 >
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
161 > 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
162 > they return a JSON value, that returns `false` for any `cxJsonIsXYZ()` function.
1339
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
163 >
bff0a078523d add documentation for cxJsonArrRemove() and cxJsonObjRemove()
Mike Becker <universe@uap-core.de>
parents: 1268
diff changeset
164 > This is **not** the case for `cxJsonArrRemove()` and `cxJsonObjRemove()`, which return `NULL` in that case.
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
165
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1339
diff changeset
166 > If you don't have full control over the JSON data, you should always check the datatype of a value first before accessing it.
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
167 >{style="note"}
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
168
1583
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
169 ## Compare Values
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
170
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
171 ```C
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
172 #include <cx/json.h>
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
173
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
174 int cxJsonCompare(const CxJsonValue *value,
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
175 const CxJsonValue *other);
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
176 ```
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
177
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
178 The function `cxJsonCompare()` performs a deep comparison of two JSON values.
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
179 It returns zero if both values are equal except for the order of object members.
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
180 When the values are not equal, the return-value is an unspecified non-zero value.
97fc8c55aeea add cxJsonCompare()
Mike Becker <universe@uap-core.de>
parents: 1573
diff changeset
181
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
182 ## Deallocate Memory
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
183
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
184 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
185 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
186
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
187 void cxJsonValueFree(CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
188 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
189
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
190 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
191 Nested values are also recursively deallocated.
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
192
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
193 > 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
194 > 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
195 >{style="warning"}
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 ## Create Objects
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
198
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
199 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
200 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
201
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
202 CxJsonValue* cxJsonCreateObj(const CxAllocator* allocator);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
203
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
204 CxJsonValue* cxJsonCreateArr(const CxAllocator* allocator);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
205
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
206 CxJsonValue* cxJsonCreateNumber(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207 const CxAllocator* allocator, double num);
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* cxJsonCreateInteger(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
210 const CxAllocator* allocator, int64_t 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* cxJsonCreateString(const CxAllocator* allocator,
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
213 AnyStr str);
1257
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* cxJsonCreateLiteral(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
216 const CxAllocator* allocator, CxJsonLiteral lit);
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 int cxJsonArrAddNumbers(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
219 const double* num, size_t count);
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 int cxJsonArrAddIntegers(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
222 const int64_t* num, size_t count);
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 int cxJsonArrAddStrings(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
225 const char* const* str, size_t count);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
226
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
227 int cxJsonArrAddCxStrings(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
228 const cxstring* str, size_t count);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
230 int cxJsonArrAddLiterals(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
231 const CxJsonLiteral* lit, size_t count);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
232
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
233 int cxJsonArrAddValues(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
234 CxJsonValue* const* val, size_t count);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
235
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
236 int cxJsonObjPut(CxJsonValue* obj, AnyStr name, CxJsonValue* child);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
237
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
238 CxJsonValue* cxJsonObjPutObj(CxJsonValue* obj, AnyStr name);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
239
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
240 CxJsonValue* cxJsonObjPutArr(CxJsonValue* obj, AnyStr name);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
241
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
242 CxJsonValue* cxJsonObjPutNumber(CxJsonValue* obj,
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
243 AnyStr name, double num);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
244
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
245 CxJsonValue* cxJsonObjPutInteger(CxJsonValue* obj,
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
246 AnyStr name, int64_t num);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
247
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
248 CxJsonValue* cxJsonObjPutString(CxJsonValue* obj,
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
249 AnyStr name, AnyStr str);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
250
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
251 CxJsonValue* cxJsonObjPutLiteral(CxJsonValue* obj,
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
252 AnyStr name, CxJsonLiteral lit);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
253 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
254
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
255 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
256 If you specify `NULL` as allocator, the `cxDefaultAllocator` is used.
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
257
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
258 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
259 you can use `cxJsonArrAddValues()` or `cxJsonObjPut()`, respectively.
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
260 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
261
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
262 ```C
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
263 #include <cx/json.h>
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
264
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
265 CxJsonValue* arr = cxJsonCreateArr(NULL);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
266
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
267 // this is equivalent...
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
268 CxJsonValue* x = cxJsonCreateInteger(NULL, 47);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
269 CxJsonValue* y = cxJsonCreateInteger(NULL, 11);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
270 cxJsonArrAddValues(arr, (CxJsonValue*[]){x, y}, 2);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
271
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
272 // ... to this
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
273 cxJsonArrAddIntegers(arr, (int64_t[]){47, 11}, 2);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
274 ```
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
275
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
276 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
277
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
278 ```C
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
279 CxJsonValue *obj = cxJsonCreateObj(NULL);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
280
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
281 cxJsonObjPutLiteral(obj, "bool", CX_JSON_FALSE);
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
282 cxJsonObjPutInteger(obj, "int", 47);
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
283
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
284 CxJsonValue *strings = cxJsonObjPutArr(obj, "strings");
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
285 cxJsonArrAddStrings(strings, (const char*[]) {"hello", "world"}, 2);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
286
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
287 CxJsonValue *nested = cxJsonObjPutObj(obj, "nested");
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
288 CxJsonValue *objects = cxJsonObjPutArr(nested, "objects");
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
289 CxJsonValue *obj_in_arr[2] = {
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
290 cxJsonCreateObj(NULL),
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
291 cxJsonCreateObj(NULL),
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
292 };
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
293 cxJsonObjPutInteger(obj_in_arr[0], "name1", 1);
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
294 cxJsonObjPutInteger(obj_in_arr[0], "name2", 3);
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
295
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
296 cxJsonObjPutInteger(obj_in_arr[1], "name2", 7);
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
297 cxJsonObjPutInteger(obj_in_arr[1], "name1", 3);
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
298
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
299 cxJsonArrAddValues(objects, obj_in_arr, 2);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
300
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
301 cxJsonArrAddNumbers(cxJsonObjPutArr(nested, "floats"),
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
302 (double[]){3.1415, 47.11, 8.15}, 3);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
303
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
304 cxJsonArrAddLiterals(cxJsonObjPutArr(nested, "literals"),
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
305 (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
306
1513
4d641c6a2f82 implement better strings for json.c + complete test coverage
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
307 CxJsonValue *ints = cxJsonObjPutArr(nested, "ints");
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
308 cxJsonArrAddIntegers(ints, (int64_t[]){4, 8, 15}, 3);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
309
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
310 CxJsonValue *nested_array = cxJsonCreateArr(NULL);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
311 cxJsonArrAddValues(ints, &nested_array, 1);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
312 cxJsonArrAddIntegers(nested_array, (int64_t[]){16, 23}, 2);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
313 cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
314
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
315 CxJsonWriter w = cxJsonWriterPretty(true);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
316 cxJsonWrite(stdout, obj, (cx_write_func) fwrite, &w);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
317
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
318 cxJsonValueFree(obj);
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
319 ```
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
320
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
321 The above code writes the following output to `stdout`:
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
322
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
323 ```JSON
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
324 {
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
325 "bool": false,
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
326 "int": 47,
1550
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
327 "strings": ["hello", "world"],
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
328 "nested": {
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
329 "objects": [{
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
330 "name1": 1,
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
331 "name2": 3
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
332 }, {
1550
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
333 "name2": 7,
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
334 "name1": 3
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
335 }],
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
336 "floats": [3.1415, 47.11, 8.15],
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
337 "literals": [true, null, false],
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
338 "ints": [4, 8, 15, [16, 23], 42]
19874e606235 fix the example in json.h.md after removing the sort_members flag
Mike Becker <universe@uap-core.de>
parents: 1547
diff changeset
339 }
1268
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
340 }
a84403b0a503 complete JSON documentation
Mike Becker <universe@uap-core.de>
parents: 1267
diff changeset
341 ```
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
342
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
343 ## Writer
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
344
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
345 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
346 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
347
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
348 typedef struct cx_json_writer_s {
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
349 bool pretty;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
350 uint8_t frac_max_digits;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
351 bool indent_space;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
352 uint8_t indent;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
353 bool escape_slash;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
354 } CxJsonWriter;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
355
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
356 CxJsonWriter cxJsonWriterCompact(void);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
357
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
358 CxJsonWriter cxJsonWriterPretty(bool use_spaces);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
359
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
360 int cxJsonWrite(void* target, const CxJsonValue* value,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
361 cx_write_func wfunc, const CxJsonWriter* settings);
1573
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
362
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
363 cxmutstr cxJsonToString(CxJsonValue *value,
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
364 const CxAllocator *allocator);
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
365
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
366 cxmutstr cxJsonToPrettyString(CxJsonValue *value,
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
367 const CxAllocator *allocator);
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
368 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
369
1267
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
370 A JSON value can be formatted with the `cxJsonWrite()` function.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
371
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
372 The `target` can be a stream, a UCX [buffer](buffer.h.md), or anything else that can be written to with a write function.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
373 The behavior of the function is controlled via a `CxJsonWriter` struct.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
374 With the functions `cxJsonWriterCompact()` and `cxJsonWriterPretty()` you can create default settings,
1573
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
375 which you may modify to suit your needs (see the table below).
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
376 The functions `cxJsonToString()` and `cxJsonToPrettyString()` are convenience functions
cd2e974410ad add cxJsonToString() and cxJsonToPrettyString() - resolves #778
Mike Becker <universe@uap-core.de>
parents: 1566
diff changeset
377 which create a writer with default settings to produce a null-terminated string allocated by the specified allocator.
1267
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
378
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
379 | Setting | Compact Default | Pretty Default | Description |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
380 |-------------------|-----------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
381 | `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. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
382 | `frac_max_digits` | 6 | 6 | The maximum number of fractional digits in a number value. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
383 | `indent_space` | ignored | depends on `use_spaces` argument | If true, use spaces for indentation, otherwise use tabs. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
384 | `indent` | ignored | 4 | If `indent_space` is `true`, this is the number of spaces per tab. Ignored otherwise. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
385 | `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. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
386
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
387
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
388 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
389 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
390 <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
391 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
392 </seealso>

mercurial