docs/Writerside/topics/json.h.md

Sun, 30 Mar 2025 18:21:43 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 30 Mar 2025 18:21:43 +0200
changeset 1267
d17eba9fae33
parent 1258
a12e102ff67f
child 1268
a84403b0a503
permissions
-rw-r--r--

document JSON writer

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
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
26 <warning>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
27 TODO: document
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
28 </warning>
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 ### List of Status Codes
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
31
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
32 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
33
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
34 | Status Code | Meaning |
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
35 |---------------------------------------|---------------------------------------------------------------------------------------------------|
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
36 | 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
37 | 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
38 | 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
39 | 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
40 | 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
41 | 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
42 | 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
43 | 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
44
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
45 ## Access Values
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
46
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
47 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
48 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
49
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
50 bool cxJsonIsObject(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
51
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
52 bool cxJsonIsArray(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
53
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
54 bool cxJsonIsString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
55
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
56 bool cxJsonIsNumber(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
57
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
58 bool cxJsonIsInteger(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
59
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
60 bool cxJsonIsLiteral(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
61
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
62 bool cxJsonIsBool(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
63
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
64 bool cxJsonIsTrue(const CxJsonValue *value);
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 bool cxJsonIsFalse(const CxJsonValue *value);
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 bool cxJsonIsNull(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
69
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
70 char *cxJsonAsString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
71
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
72 cxstring cxJsonAsCxString(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
73
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
74 cxmutstr cxJsonAsCxMutStr(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
75
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
76 double cxJsonAsDouble(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
77
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
78 int64_t cxJsonAsInteger(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 bool cxJsonAsBool(const CxJsonValue *value);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
81
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82 size_t cxJsonArrSize(const CxJsonValue *value);
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 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
85
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 CxJsonValue *cxJsonObjGet(const CxJsonValue *value, AnyStr name);
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 CxIterator cxJsonArrIter(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 CxIterator cxJsonObjIter(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
1258
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
93 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
94
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
95 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
96 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
97
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
98 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
99
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
100 > 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
101 > 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
102 >
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
103 > 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
104 > `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
105 >{style="note"}
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
106
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
107 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
108
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
109 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
110 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
111
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
112 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
113 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
114
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
115 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
116
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
117 > 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
118 >
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
119 > 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
120 > 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
121
a12e102ff67f add status code documentation and documentation for accessing values
Mike Becker <universe@uap-core.de>
parents: 1257
diff changeset
122 > 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
123 >{style="note"}
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
124
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
125 ## Deallocate Memory
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
126
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
127 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
128 #include <cx/json.h>
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 void cxJsonValueFree(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
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
133 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
134 Nested values are also recursively deallocated.
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
135
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
136 > 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
137 > 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
138 >{style="warning"}
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
139
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
140 ## Create Objects
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
141
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
142 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
143 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
144
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
145 CxJsonValue* cxJsonCreateObj(const CxAllocator* allocator);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
146
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
147 CxJsonValue* cxJsonCreateArr(const CxAllocator* allocator);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
148
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
149 CxJsonValue* cxJsonCreateNumber(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
150 const CxAllocator* allocator, double num);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
151
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
152 CxJsonValue* cxJsonCreateInteger(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
153 const CxAllocator* allocator, int64_t num);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
154
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
155 CxJsonValue* cxJsonCreateString(const CxAllocator* allocator,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
156 const char *str);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
157
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
158 CxJsonValue* cxJsonCreateCxString(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
159 const CxAllocator* allocator, cxstring str);
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 CxJsonValue* cxJsonCreateLiteral(
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
162 const CxAllocator* allocator, CxJsonLiteral lit);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
163
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
164 int cxJsonArrAddNumbers(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
165 const double* num, size_t count);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
166
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
167 int cxJsonArrAddIntegers(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
168 const int64_t* num, size_t count);
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 int cxJsonArrAddStrings(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171 const char* const* str, size_t count);
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 int cxJsonArrAddCxStrings(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
174 const cxstring* str, size_t count);
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 int cxJsonArrAddLiterals(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
177 const CxJsonLiteral* lit, size_t count);
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 int cxJsonArrAddValues(CxJsonValue* arr,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
180 CxJsonValue* const* val, size_t count);
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 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
183
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
184 CxJsonValue* cxJsonObjPutObj(CxJsonValue* obj, cxstring name);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
185
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
186 CxJsonValue* cxJsonObjPutArr(CxJsonValue* obj, cxstring name);
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 CxJsonValue* cxJsonObjPutNumber(CxJsonValue* obj,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
189 cxstring name, double num);
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 CxJsonValue* cxJsonObjPutInteger(CxJsonValue* obj,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
192 cxstring name, int64_t num);
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 CxJsonValue* cxJsonObjPutString(CxJsonValue* obj,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
195 cxstring name, const char* str);
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 CxJsonValue* cxJsonObjPutCxString(CxJsonValue* obj,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
198 cxstring name, cxstring str);
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 CxJsonValue* cxJsonObjPutLiteral(CxJsonValue* obj,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
201 cxstring name, CxJsonLiteral lit);
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
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
204 <warning>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
205 TODO: document
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
206 </warning>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
208 ## Writer
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
209
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
210 ```C
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
211 #include <cx/json.h>
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
212
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
213 typedef struct cx_json_writer_s {
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
214 bool pretty;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
215 bool sort_members;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
216 uint8_t frac_max_digits;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
217 bool indent_space;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
218 uint8_t indent;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
219 bool escape_slash;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
220 } CxJsonWriter;
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
221
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
222 CxJsonWriter cxJsonWriterCompact(void);
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 CxJsonWriter cxJsonWriterPretty(bool use_spaces);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
225
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
226 int cxJsonWrite(void* target, const CxJsonValue* value,
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
227 cx_write_func wfunc, const CxJsonWriter* settings);
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
228 ```
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229
1267
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
230 A JSON value can be formatted with the `cxJsonWrite()` function.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
231
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
232 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
233 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
234 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
235 which you may modify to suit your needs.
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
236
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
237 | Setting | Compact Default | Pretty Default | Description |
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
238 |-------------------|-----------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
d17eba9fae33 document JSON writer
Mike Becker <universe@uap-core.de>
parents: 1258
diff changeset
239 | `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
240 | `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
241 | `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
242 | `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
243 | `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
244 | `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
245
1257
946cadf95ea4 define structure for json.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
246
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
247 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
248 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
249 <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
250 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
251 </seealso>

mercurial