Thu, 30 Oct 2025 19:27:18 +0100
fix typo bug in cxListDifference() - resolves #745
| 1143 
0559812df10c
assign proper names to the documentation topics
 Mike Becker <universe@uap-core.de> parents: 
1142diff
changeset | 1 | # JSON | 
| 1142 
9437530176bc
add symbols that need documentation as TODOs
 Mike Becker <universe@uap-core.de> parents: 
1141diff
changeset | 2 | |
| 1267 | 3 | The UCX JSON API allows [parsing](#parser) and [formatting](#writer) of JSON data. | 
| 4 | ||
| 5 | The parser API is similar to the [properties](properties.h.md) parser, | |
| 6 | but - due to the nature of JSON - is not allocation-free. | |
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 7 | |
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 8 | ## Parser | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 9 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 10 | ```C | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 11 | #include <cx/json.h> | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 12 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 13 | void cxJsonInit(CxJson *json, const CxAllocator *allocator); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 14 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 15 | void cxJsonReset(CxJson *json); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 16 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
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: 
1190diff
changeset | 18 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 19 | int cxJsonFill(CxJson *json, AnyStr str); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 20 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 21 | CxJsonStatus cxJsonNext(CxJson *json, CxJsonValue **value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 22 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 23 | void cxJsonDestroy(CxJson *json); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 24 | ``` | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 25 | |
| 1268 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
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: 
1267diff
changeset | 28 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 30 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 31 | The actual parsing is an interleaving invocation of the `cxJsonFill()` (or `cxJsonFilln()`) and `cxJsonNext()` functions. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1339diff
changeset | 32 | The `cxJsonFill()` function is a convenience function that accepts UCX strings and normal zero-terminated C strings. | 
| 1268 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 33 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
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: 
1267diff
changeset | 36 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 37 | > The parser is capable of parsing multiple consecutive JSON values. | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 39 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 41 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 43 | but the parsed input does not constitute a complete JSON value. | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 45 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
changeset | 47 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
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: 
1267diff
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: 
1190diff
changeset | 50 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 51 | ### List of Status Codes | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 52 | |
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
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: 
1257diff
changeset | 54 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 55 | | Status Code | Meaning | | 
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 56 | |---------------------------------------|---------------------------------------------------------------------------------------------------| | 
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1257diff
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: 
1190diff
changeset | 65 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 66 | ## Access Values | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 67 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 68 | ```C | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 69 | #include <cx/json.h> | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 70 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 71 | bool cxJsonIsObject(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 72 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 73 | bool cxJsonIsArray(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 74 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 75 | bool cxJsonIsString(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 76 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 77 | bool cxJsonIsNumber(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 78 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 79 | bool cxJsonIsInteger(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 80 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 81 | bool cxJsonIsLiteral(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 82 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 83 | bool cxJsonIsBool(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 84 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 85 | bool cxJsonIsTrue(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 86 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 87 | bool cxJsonIsFalse(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 88 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 89 | bool cxJsonIsNull(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 90 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 91 | char *cxJsonAsString(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 92 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 93 | cxstring cxJsonAsCxString(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 94 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 95 | cxmutstr cxJsonAsCxMutStr(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 96 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 97 | double cxJsonAsDouble(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 98 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 99 | int64_t cxJsonAsInteger(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 100 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 101 | bool cxJsonAsBool(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 102 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 103 | size_t cxJsonArrSize(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 104 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 105 | CxJsonValue *cxJsonArrGet(const CxJsonValue *value, size_t index); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 106 | |
| 1339 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 107 | CxJsonValue *cxJsonArrRemove(const CxJsonValue *value, size_t index); | 
| 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 108 | |
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 109 | CxJsonValue *cxJsonObjGet(const CxJsonValue *value, AnyStr name); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 110 | |
| 1339 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 111 | CxJsonValue *cxJsonObjRemove(const CxJsonValue *value, AnyStr name); | 
| 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 112 | |
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 113 | CxIterator cxJsonArrIter(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 114 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 115 | CxIterator cxJsonObjIter(const CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 116 | ``` | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 117 | |
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 118 | 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: 
1257diff
changeset | 119 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1339diff
changeset | 120 | The JSON specification only defines numbers, therefore `cxJsonIsNumber()` returns true for both floating-point and integer numbers. | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 121 | 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: 
1257diff
changeset | 122 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 123 | 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: 
1257diff
changeset | 124 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 125 | > 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: 
1257diff
changeset | 126 | > 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: 
1257diff
changeset | 127 | > | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1339diff
changeset | 128 | > Additionally, UCX does implement the JavaScript concept of a "falsy" value, meaning that | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 129 | > `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: 
1257diff
changeset | 130 | >{style="note"} | 
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 131 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 132 | 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: 
1257diff
changeset | 133 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 134 | 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: 
1257diff
changeset | 135 | 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: 
1257diff
changeset | 136 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 137 | 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: 
1257diff
changeset | 138 | which can be accessed via index with `cxJsonArrGet()` or via an iterator created with `cxJsonArrIter()`. | 
| 1339 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 139 | An element can be removed from an array with `cxJsonArrRemove()`. | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 140 | |
| 1339 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 141 | The function `cxJsonObjGet()` returns the member in a JSON object associated with the specified `name`. | 
| 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 142 | To remove a member, use `cxJsonObjRemove()`. | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 143 | |
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 144 | > 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: 
1257diff
changeset | 145 | > | 
| 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 146 | > 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: 
1257diff
changeset | 147 | > they return a JSON value, that returns `false` for any `cxJsonIsXYZ()` function. | 
| 1339 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 148 | > | 
| 
bff0a078523d
add documentation for cxJsonArrRemove() and cxJsonObjRemove()
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 149 | > This is **not** the case for `cxJsonArrRemove()` and `cxJsonObjRemove()`, which return `NULL` in that case. | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 150 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1339diff
changeset | 151 | > If you don't have full control over the JSON data, you should always check the datatype of a value first before accessing it. | 
| 1258 
a12e102ff67f
add status code documentation and documentation for accessing values
 Mike Becker <universe@uap-core.de> parents: 
1257diff
changeset | 152 | >{style="note"} | 
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 153 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 154 | ## Deallocate Memory | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 155 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 156 | ```C | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 157 | #include <cx/json.h> | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 158 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 159 | void cxJsonValueFree(CxJsonValue *value); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 160 | ``` | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 161 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 162 | 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: 
1190diff
changeset | 163 | Nested values are also recursively deallocated. | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 164 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 165 | > 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: 
1190diff
changeset | 166 | > 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: 
1190diff
changeset | 167 | >{style="warning"} | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 168 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 169 | ## Create Objects | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 170 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 171 | ```C | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 172 | #include <cx/json.h> | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 173 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 174 | CxJsonValue* cxJsonCreateObj(const CxAllocator* allocator); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 175 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 176 | CxJsonValue* cxJsonCreateArr(const CxAllocator* allocator); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 177 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 178 | CxJsonValue* cxJsonCreateNumber( | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 179 | const CxAllocator* allocator, double num); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 180 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 181 | CxJsonValue* cxJsonCreateInteger( | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 182 | const CxAllocator* allocator, int64_t num); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 183 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 184 | CxJsonValue* cxJsonCreateString(const CxAllocator* allocator, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 185 | const char *str); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 186 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 187 | CxJsonValue* cxJsonCreateCxString( | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 188 | const CxAllocator* allocator, cxstring str); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 189 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 190 | CxJsonValue* cxJsonCreateLiteral( | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 191 | const CxAllocator* allocator, CxJsonLiteral lit); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 192 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 193 | int cxJsonArrAddNumbers(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 194 | const double* num, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 195 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 196 | int cxJsonArrAddIntegers(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 197 | const int64_t* num, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 198 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 199 | int cxJsonArrAddStrings(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 200 | const char* const* str, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 201 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 202 | int cxJsonArrAddCxStrings(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 203 | const cxstring* str, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 204 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 205 | int cxJsonArrAddLiterals(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 206 | const CxJsonLiteral* lit, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 207 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 208 | int cxJsonArrAddValues(CxJsonValue* arr, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 209 | CxJsonValue* const* val, size_t count); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 210 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 211 | int cxJsonObjPut(CxJsonValue* obj, cxstring name, CxJsonValue* child); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 212 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 213 | CxJsonValue* cxJsonObjPutObj(CxJsonValue* obj, cxstring name); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 214 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 215 | CxJsonValue* cxJsonObjPutArr(CxJsonValue* obj, cxstring name); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 216 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 217 | CxJsonValue* cxJsonObjPutNumber(CxJsonValue* obj, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 218 | cxstring name, double num); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 219 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 220 | CxJsonValue* cxJsonObjPutInteger(CxJsonValue* obj, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 221 | cxstring name, int64_t num); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 222 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 223 | CxJsonValue* cxJsonObjPutString(CxJsonValue* obj, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 224 | cxstring name, const char* str); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 225 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 226 | CxJsonValue* cxJsonObjPutCxString(CxJsonValue* obj, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 227 | cxstring name, cxstring str); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 228 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 229 | CxJsonValue* cxJsonObjPutLiteral(CxJsonValue* obj, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 230 | cxstring name, CxJsonLiteral lit); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 231 | ``` | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 232 | |
| 1268 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 233 | 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: 
1267diff
changeset | 234 | If you specify `NULL` as allocator, the `cxDefaultAllocator` is used. | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 235 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 236 | 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: 
1267diff
changeset | 237 | you can use `cxJsonArrAddValues()` or `cxJsonObjPut()`, respectively. | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 238 | 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: 
1267diff
changeset | 239 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 240 | ```C | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 241 | #include <cx/json.h> | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 242 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 243 | CxJsonValue* arr = cxJsonCreateArr(NULL); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 244 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 245 | // this is equivalent... | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 246 | CxJsonValue* x = cxJsonCreateInteger(NULL, 47); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 247 | CxJsonValue* y = cxJsonCreateInteger(NULL, 11); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 248 | cxJsonArrAddValues(arr, (CxJsonValue*[]){x, y}, 2); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 249 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 250 | // ... to this | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 251 | cxJsonArrAddIntegers(arr, (int64_t[]){47, 11}, 2); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 252 | ``` | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 253 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 254 | The following example shows how to construct a complete JSON object. | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 255 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 256 | ```C | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 257 | CxJsonValue *obj = cxJsonCreateObj(NULL); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 258 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 259 | cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 260 | cxJsonObjPutInteger(obj, CX_STR("int"), 47); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 261 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 262 | CxJsonValue *strings = cxJsonObjPutArr(obj, CX_STR("strings")); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 263 | cxJsonArrAddStrings(strings, (const char*[]) {"hello", "world"}, 2); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 264 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 265 | CxJsonValue *nested = cxJsonObjPutObj(obj, CX_STR("nested")); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 266 | CxJsonValue *objects = cxJsonObjPutArr(nested, CX_STR("objects")); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 267 | CxJsonValue *obj_in_arr[2] = { | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 268 | cxJsonCreateObj(NULL), | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 269 | cxJsonCreateObj(NULL), | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 270 | }; | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 271 | cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name1"), 1); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 272 | cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name2"), 3); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 273 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 274 | cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name2"), 7); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 275 | cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name1"), 3); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 276 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 277 | cxJsonArrAddValues(objects, obj_in_arr, 2); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 278 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 279 | cxJsonArrAddNumbers(cxJsonObjPutArr(nested, CX_STR("floats")), | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 280 | (double[]){3.1415, 47.11, 8.15}, 3); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 281 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 282 | cxJsonArrAddLiterals(cxJsonObjPutArr(nested, CX_STR("literals")), | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 283 | (CxJsonLiteral[]){CX_JSON_TRUE, CX_JSON_NULL, CX_JSON_FALSE}, 3); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 284 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 285 | CxJsonValue *ints = cxJsonObjPutArr(nested, CX_STR("ints")); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 286 | cxJsonArrAddIntegers(ints, (int64_t[]){4, 8, 15}, 3); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 287 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 288 | CxJsonValue *nested_array = cxJsonCreateArr(NULL); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 289 | cxJsonArrAddValues(ints, &nested_array, 1); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 290 | cxJsonArrAddIntegers(nested_array, (int64_t[]){16, 23}, 2); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 291 | cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 292 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 293 | CxJsonWriter w = cxJsonWriterPretty(true); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 294 | cxJsonWrite(stdout, obj, (cx_write_func) fwrite, &w); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 295 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 296 | cxJsonValueFree(obj); | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 297 | ``` | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 298 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 299 | The above code writes the following output to `stdout`: | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 300 | |
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 301 | ```JSON | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 302 | { | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 303 | "bool": false, | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 304 | "int": 47, | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 305 | "nested": { | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 306 | "floats": [3.1415, 47.11, 8.15], | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 307 | "ints": [4, 8, 15, [16, 23], 42], | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 308 | "literals": [true, null, false], | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 309 | "objects": [{ | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 310 | "name1": 1, | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 311 | "name2": 3 | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 312 | }, { | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 313 | "name1": 3, | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 314 | "name2": 7 | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 315 | }] | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 316 | }, | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 317 | "strings": ["hello", "world"] | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 318 | } | 
| 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1267diff
changeset | 319 | ``` | 
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 320 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 321 | ## Writer | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 322 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 323 | ```C | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 324 | #include <cx/json.h> | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 325 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 326 | typedef struct cx_json_writer_s { | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 327 | bool pretty; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 328 | bool sort_members; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 329 | uint8_t frac_max_digits; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 330 | bool indent_space; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 331 | uint8_t indent; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 332 | bool escape_slash; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 333 | } CxJsonWriter; | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 334 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 335 | CxJsonWriter cxJsonWriterCompact(void); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 336 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 337 | CxJsonWriter cxJsonWriterPretty(bool use_spaces); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 338 | |
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 339 | int cxJsonWrite(void* target, const CxJsonValue* value, | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 340 | cx_write_func wfunc, const CxJsonWriter* settings); | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 341 | ``` | 
| 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 342 | |
| 1267 | 343 | A JSON value can be formatted with the `cxJsonWrite()` function. | 
| 344 | ||
| 345 | The `target` can be a stream, a UCX [buffer](buffer.h.md), or anything else that can be written to with a write function. | |
| 346 | The behavior of the function is controlled via a `CxJsonWriter` struct. | |
| 347 | With the functions `cxJsonWriterCompact()` and `cxJsonWriterPretty()` you can create default settings, | |
| 348 | which you may modify to suit your needs. | |
| 349 | ||
| 350 | | Setting | Compact Default | Pretty Default | Description | | |
| 351 | |-------------------|-----------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| | |
| 352 | | `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. | | |
| 353 | | `sort_members` | `true` | `true` | If false members are written in the order in which they were added. If true, they are sorted lexicographically. | | |
| 354 | | `frac_max_digits` | 6 | 6 | The maximum number of fractional digits in a number value. | | |
| 355 | | `indent_space` | ignored | depends on `use_spaces` argument | If true, use spaces for indentation, otherwise use tabs. | | |
| 356 | | `indent` | ignored | 4 | If `indent_space` is `true`, this is the number of spaces per tab. Ignored otherwise. | | |
| 357 | | `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. | | |
| 358 | ||
| 1257 
946cadf95ea4
define structure for json.h doc
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 359 | |
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 360 | <seealso> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 361 | <category ref="apidoc"> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 362 | <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: 
1143diff
changeset | 363 | </category> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 364 | </seealso> |