When using JSON objects in ABL I can work with property names in a couple of ways
- jsonData:GetNames(output arrayOfNames) and loop through them one at a time.
- jsonData:Has("string name") and jsonData:Get*("string name").
Assuming I know the property I want , what good strategies do I have for reducing errors in the names?
- I can just use a string "ioMode" which I repeat through the code. Not great since it's very error prone to typos and case-sensitivity issues
- I can add a static private property (or variable or preprocessor) which holds the name
DEF PRIVATE STATIC PROPERTY IO_MODE_PROP_NAME AS CHAR INIT 'ioMode' GET.
- It strikes me as I type this that I can use an enum too
ENUM PropertyNamesEnum:
DEF ENUM ioMode.
END ENUM
and do something like
jsonData:Has(string(PropertyNamesEnum:ioMode))
- anything else that I'm missing? Any other approaches that you use?
JSON example
"/Employee": {
"GET": {
"contentType": "application/json",
"jsdo": {
"entityName": "doh.EmployeeBE",
"function": "readData",
"operation": "read",
"schema": "dsEmployee"
},
"entity": {
"name": "doh.EmployeeBE",
"function": "readData",
"arg": [
{
"ablName": "pcFilter",
"ioMode": "INPUT",
"ablType": "Character",
"msgElem": {"type": "QUERY", "name": "filter"}
},
{
"ablName": "dsEmployee",
"ablType": "dataset",
"ioMode": "OUTPUT",
"msgElem": [{"type": "BODY","name": null}]
},
Within the application, we preferably work with ABL classes, not JSON objects.
We still prefer the use of our own JSON Serializable classes (github.com/.../ListsAndEnumSamples) as this gives us a greater freedom to deal with the mapping (e.g. JSON String properties to ABL Enums). Another aspect is that we have implemented case-insensitivity for JSON property names in the serialization process. I don't want to relay on a JavaScript programmer to match the casing style of the ABL programmer.
So we typically deal with the JSON serialization/deserialization only on the Service Interface layer.