Register all variables you require in constructor of object
Create hierarchy from objects if you need more complex structures
Simple Declaration
// Example objectclassMyObject:JsonApiStruct{string name;string year;voidMyObject(){// these variables will be converted to JSON or filled from JSONRegV("name");RegV("year");}}
RegV() adds the provided variable name to the defined object's list of values to be processed.
Registered variable names are case-sensitive!
Non-registered variables are simply ignored.
File Operations
You can store your object into file (ie. invoke Pack + Save to file) or you can just save already packed JSON (Save to File).
File Import
// unpack from RAW data - either put data there manually (JSON!) or its callback resultvoidUnpackFromRAW(string data){Dummy dummy =newDummy();// Dummy extends JsonApiStruct
dummy.ExpandFromRAW(data);// pack + create file at once
dummy.SaveToFile("dummy_test.json");}// call OnPack() and save result into filevoidPackAndSaveLocally(){
dummy.PackToFile("dummy_test.json");}
File Export
voidLoadJSON(){Dummy dummy =newDummy();// Dummy extends JsonApiStruct
dummy.LoadFromFile("dummy_test.json");// now dummy object is hydrated with json data// note that Expand is automatically called upon object// you can also use its data as stringPrint(dummy.AsString());}
Packing
Packing is fairly easy, when object is either asked by thread/callback or invoked manually to pack its data, the OnPack() event method is called.
ⓘ
See the JSON Validation chapter below for a simple way to check JSON structure.
Automated Packing/Expanding
To make things easier, it is possible to work with a JSON object just by registering variables and object into JsonApiStruct.
What Works
What Does not
If JSON is expanded onto given object or hierarchy and variable name and format match, variables are filled with appropriate data
If JSON is assembled from given object or hierarchy, variable content is used to create JSON structures
float, int, bool, string, array, object and array of objects are supported
automatic allocation of object
getting JSON as string
Even though the JSON format does support it, multi-type arrays (like combined strings and integers) are not supported by Enforce Script
Declaration of variables or objects - if there is no adequate variable present on during expand, it is ignored - if an object type is missing, it cannot be expanded
// ChildclassMyChild:JsonApiStruct{// object example}// ParentclassMyParent:JsonApiStruct{string name;string year;MyChild obj1;voidMyParent(){
obj1 =newMyChild();// this register variables for auto useRegV("name");RegV("year");RegV("obj1");}}
// Create JSON and print to consolevoidPackExample(){MyParent dummy =newMyParent();// variables will be default unless set to something reasonable
dummy.name ="King Henry VIII";
dummy.year = 1509;// create JSON
dummy.Pack();// print result data to console as stringPrint(dummy.AsString());}// Load from existing file in JSON formatvoidLoadAndExpandExample(){MyParent dummy =newMyParent();
dummy.LoadFromFile("dummy_test.json");// now json is upon dummy object// note that Expand is called automatically upon object and all variables registered!// no additional scripting required unless you want to handle something specific or debug perhaps// you can also use its data as stringPrint(dummy.AsString());}
Variables
// assuming you have variables declared upon JsonApiStruct itself!floatm_fMyFloat;// add simple variablevoidOnPack(){StoreFloat("MyFloat",m_fMyFloat);}
Objects and Variables
// assuming variables are declared upon JsonApiStruct itselffloatm_fMyFloat;intm_iMyInt;protectedrefAvatarStructm_Avatar;// AvatarStruct extends JsonApiStruct// add object and several variablesvoidOnPack(){StoreFloat("MyFloat",m_fMyFloat);StoreInt("MyInt",m_iMyInt);StoreObject("avatar",m_Avatar);}
If the OnPack() event method is declared upon children objects, it is called upon them hierarchically as well.
// assuming the array is declared upon JsonStruct itselfprotectedrefarray<string>m_aItems={};// add array and its itemsvoidOnPack(){StartArray("m_aItems");foreach(string item :m_aItems){ItemString(item);}EndArray();}
Error Handling
If you use object as a callback and an error happen during JSON processing, it generates events upon that very object:
classDummy:JsonApiStruct{voidOnExpand(){// Event when expand (unpack) process starts// if you want to handle something before process starts (init/clear variables for example)}voidOnBufferReady(){// this is called after successfull JSON pakc process// if you want the buffer's finalised string for any purpose}voidOnSuccess(int errorCode){// errorCode is EJsonApiError// Event called when pending store operation is finished - callback when all went as expected}voidOnError(int errorCode){// errorCode is EJsonApiError// Event called when pending store operation is finished - callback when error happened}}
ⓘ
Error codes are processed as such due to the asynchronous processing of REST requests in order not to block the main thread and stop the game from processing.
This is generated upon sucessfull processing at onSuccess() event
ETJSON_COMMSEND
Sending of object failed (callback got error code)
ETJSON_COMMRECV
Receiving of object failed (callback got error code)
ETJSON_PARSERERROR
Parsing process failed - invalid data or corrupted format?
ETJSON_PACKNOSTART
Packing process cannot start - invalid state or other problems
ETJSON_TIMEOUT
Failed to send data due to timeout (when JsonStruct data is sent via RestApi or BackendApi
ETJSON_NOBUFFERS
Too many objects processed at once!
ETJSON_FAILFILELOAD
Could not load file with JSON data
ETJSON_FAILFILESAVE
Could not save file with JSON data
JSON Validation
JSON validation allows to test the input/output values.
Result structure can be used as input as well and it should match in the end, similar process can be used for verifying already existing structures.
// root structure exampleclassDummyRoot:JsonApiStruct{// content + pack/expand methods}DummyRoot dummy =newDummyRoot();
dummy.Pack();// pack contentstring data1 = dummy.AsString();// get packed JSON #1
dummy.ExpandFromRAW(data1);// load structure once more from data!// repeat process :-)
dummy.Pack();// pack contentstring data2 = dummy.AsString();// get packed JSON #2// now both can be visualised
Packing object will produce a long, non-formatted string like:
{"m_bool":false,"m_int":1024,"m_double":1.2345678806304932,"m_string":"Hello I am your new string!","m_objects":{"obj1":{"name":"Van Ceulen","year":"1706","val":3.1415927410125734},"obj2":{"name":"Bernoulli","year":"1683","val":0.5772156715393066},"obj3":{"name":"Feidius","year":"430BC","val":1.6180340051651}}}
Use suitable online/other tool for readable structure, result can be stored to textfile and compared by binary/text compare tool if necessary.
ⓘ
JSONFormatter.org offers a JSON beautifier (default tabulation = 2 spaces)
Notepad++ has the feature built-in (default tabulation = 1 tab); Plugins > JSON Viewer > Format JSON (Ctrl + Alt + ⇧ Shift + M):
{"m_bool":false,"m_int":1024,"m_double":1.2345678806304932,"m_string":"Hello I am your new string!","m_objects":{"obj1":{"name":"Van Ceulen","year":"1706","val":3.1415927410125734},"obj2":{"name":"Bernoulli","year":"1683","val":0.5772156715393066},"obj3":{"name":"Feidius","year":"430BC","val":1.6180340051651}}}