JsonApiStruct Usage – Arma Reforger
Lou Montana (talk | contribs) m (Some wiki formatting) |
Lou Montana (talk | contribs) m (Some wiki formatting) |
||
(6 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
'''{{Link/Enfusion|armaR|JsonApiStruct}}''' is scripted object with support to: | '''{{Link/Enfusion|armaR|JsonApiStruct}}''' is scripted object with support to: | ||
* Encode script object/ variable to JSON format | * Encode script object/variable to JSON format | ||
* Decode data from JSON format onto script object/ variable | * Decode data from JSON format onto script object/ variable | ||
* Import/export from/to file | * Import/export from/to file | ||
Line 10: | Line 10: | ||
{{Feature|informative| | {{Feature|informative| | ||
JsonApiStruct is primarily meant for automatic data "conversion" from JSON to script - but it is also possible to assemble JSON using object's API: | {{Link/Enfusion|armaR|JsonApiStruct}} is primarily meant for automatic data "conversion" from JSON to script - but it is also possible to assemble JSON using object's API: | ||
# by using the variable registration system - based upon additional variable registering ''via'' the <enforce inline>RegV()</enforce> (Register Variable) method | # by using the variable registration system - based upon additional variable registering ''via'' the <enforce inline>RegV()</enforce> (Register Variable) method | ||
# as general stream assembly - by calling | # as general stream assembly - by calling methods to add values, object or starting arrays | ||
}} | }} | ||
Line 18: | Line 18: | ||
== How To == | == How To == | ||
* Create your own class by inheriting JsonApiStruct | * Create your own class by inheriting {{Link/Enfusion|armaR|JsonApiStruct}} | ||
* Register all variables you require in constructor of object | * Register all variables you require in constructor of object | ||
* Create hierarchy from objects if you need more complex structures | * Create hierarchy from objects if you need more complex structures | ||
Line 90: | Line 90: | ||
== File Operations == | == File Operations == | ||
You can store | 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 === | === File Import === | ||
<enforce> | <enforce> | ||
// unpack from RAW data - either put data there manually (JSON!) or | // unpack from RAW data - either put data there manually (JSON!) or its callback result | ||
void UnpackFromRAW(string data) | void UnpackFromRAW(string data) | ||
{ | { | ||
Line 140: | Line 140: | ||
{| class="wikitable valign-top" | {| class="wikitable valign-top" | ||
! What Works | ! What Works | ||
! What | ! What Does not | ||
|- | |- | ||
| | | | ||
* If JSON is expanded onto given object or hierarchy and variable name | * 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 | * If JSON is assembled from given object or hierarchy, variable content is used to create JSON structures | ||
* float, int, | * float, int, bool, string, array, object and array of objects are supported | ||
* automatic allocation of object | * automatic allocation of object | ||
* getting JSON as string | * getting JSON as string | ||
| | | | ||
* Even though JSON format does support it | * 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 | * 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 | ||
|} | |} | ||
Line 206: | Line 206: | ||
// no additional scripting required unless you want to handle something specific or debug perhaps | // no additional scripting required unless you want to handle something specific or debug perhaps | ||
// you can also use | // you can also use its data as string | ||
Print(dummy.AsString()); | Print(dummy.AsString()); | ||
} | } | ||
Line 215: | Line 215: | ||
<enforce> | <enforce> | ||
// assuming you have variables declared upon JsonApiStruct itself! | // assuming you have variables declared upon JsonApiStruct itself! | ||
float | float m_fMyFloat; | ||
// add simple variable | // add simple variable | ||
void OnPack() | void OnPack() | ||
{ | { | ||
StoreFloat("MyFloat", | StoreFloat("MyFloat", m_fMyFloat); | ||
} | } | ||
</enforce> | </enforce> | ||
Line 228: | Line 228: | ||
<enforce> | <enforce> | ||
// assuming variables are declared upon JsonApiStruct itself | // assuming variables are declared upon JsonApiStruct itself | ||
float | float m_fMyFloat; | ||
int | int m_iMyInt; | ||
protected ref AvatarStruct m_Avatar; // AvatarStruct extends JsonApiStruct | protected ref AvatarStruct m_Avatar; // AvatarStruct extends JsonApiStruct | ||
Line 235: | Line 235: | ||
void OnPack() | void OnPack() | ||
{ | { | ||
StoreFloat("MyFloat", | StoreFloat("MyFloat", m_fMyFloat); | ||
StoreInt("MyInt", | StoreInt("MyInt", m_iMyInt); | ||
StoreObject("avatar", m_Avatar); | StoreObject("avatar", m_Avatar); | ||
} | } | ||
Line 245: | Line 245: | ||
<enforce> | <enforce> | ||
// assuming the array is declared upon JsonStruct itself | // assuming the array is declared upon JsonStruct itself | ||
protected ref array<string> | protected ref array<string> m_aItems = {}; | ||
// add array and its items | // add array and its items | ||
void OnPack() | void OnPack() | ||
{ | { | ||
StartArray(" | StartArray("m_aItems"); | ||
foreach (string item : m_aItems) | |||
{ | { | ||
ItemString( | ItemString(item); | ||
} | } | ||
EndArray(); | EndArray(); | ||
Line 364: | Line 364: | ||
{"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}}} | {"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 | Use suitable online/other tool for readable structure, result can be stored to textfile and compared by binary/text compare tool if necessary. | ||
{{Feature|informative| | {{Feature|informative| | ||
* {{Link|https://jsonformatter.org/|JSONFormatter.org}} offers a {{ | * {{Link|https://jsonformatter.org/|JSONFormatter.org}} offers a JSON beautifier (default tabulation {{=}} 2 spaces) | ||
{{Link|https://notepad-plus-plus.org/|Notepad++}} has the feature built-in; Plugins > JSON Viewer > Format JSON ({{Controls|Ctrl|Alt|Shift|M}}): <spoiler text="Show Result"> | * {{Link|https://notepad-plus-plus.org/|Notepad++}} has the feature built-in (default tabulation {{=}} 1 tab); Plugins > JSON Viewer > Format JSON ({{Controls|Ctrl|Alt|Shift|M}}): <spoiler text="Show Result"> | ||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
{ | { |
Latest revision as of 23:11, 15 July 2024
JsonApiStruct is scripted object with support to:
- Encode script object/variable to JSON format
- Decode data from JSON format onto script object/ variable
- Import/export from/to file
- Import/export from/to string
It can also be used as callback object when handling responses from Backend API (script) where incoming data are automatically expanded.
How To
- Create your own class by inheriting JsonApiStruct
- Register all variables you require in constructor of object
- Create hierarchy from objects if you need more complex structures
Simple Declaration
Hierarchy Declaration
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
File Export
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.
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 |
---|---|
|
|
Variables
Objects and Variables
If the OnPack() event method is declared upon children objects, it is called upon them hierarchically as well.
Error Handling
If you use object as a callback and an error happen during JSON processing, it generates events upon that very object:
Error Codes
As defined in EJsonApiError:
Code Enum | Description |
---|---|
ETJSON_UNKNOWN | General error - not implemented |
ETJSON_OK | 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.
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.