docs/Writerside/topics/json.h.md

Mon, 31 Mar 2025 19:39:42 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 31 Mar 2025 19:39:42 +0200
changeset 1268
a84403b0a503
parent 1267
d17eba9fae33
permissions
-rw-r--r--

complete JSON documentation

relates to #451

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # JSON
1142
9437530176bc add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
2
1267
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
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
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
335 A JSON value can be formatted with the `cxJsonWrite()` function.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
336
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
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.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
338 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
339 With the functions `cxJsonWriterCompact()` and `cxJsonWriterPretty()` you can create default settings,
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
340 which you may modify to suit your needs.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
341
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
342 | Setting | Compact Default | Pretty Default | Description |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
343 |-------------------|-----------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
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. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
345 | `sort_members` | `true` | `true` | If false members are written in the order in which they were added. If true, they are sorted lexicographically. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
346 | `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
347 | `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
348 | `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
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. |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
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>

mercurial