Update 03/06/2015: JSONTOOL has now been updated and tested. Here is a link to a proof of concept/demo.
Our first version of JSONTOOL, our RPG JSON parser, was limited to strings of 65k in size.
We are currently in the testing mode for a second version of our JSONTOOL that will not only include the F.JSON service program which some of you are using, but it will also contain service program F.JSON2 which will contain a host of new functions and also let you process strings and stream files of up to 16meg.
Here is a small example of how it works using a string:
H DFTACTGRP(*NO) BNDDIR('BVSTOOLS')
****************************************************************
* Imports
****************************************************************
/COPY QCOPYSRC,P.JSON2
/COPY QCOPYSRC,P.STRINGS
****************************************************************
D vString S 65535
D errMsg S 256
D rc S 10i 0
*
D v_id S 128 DIM(MAX_VEHICLES)
D v_vin S 128 DIM(MAX_VEHICLES)
D v_odo S 13P 5 DIM(MAX_VEHICLES)
D v_lpstate S 2 DIM(MAX_VEHICLES)
********************************************************************
/free
//vString should NOT be varying
vString = '{+
"id":352104,+
"vin":"123456",+
"label":"3070",+
"color":"WHITE",+
"make":"VOLVO",+
"model":"VN",+
"deviceSerialNumber":"5010395849",+
"year":2005,+
"odometer":{+
"units":"MILES",+
"timestamp":"2014-10-14T18:37:13Z",+
"readOnly":"TRUE",+
"value":199400.38+
},+
"engineRunTime":{+
"isTracked":"ALWAYS",+
"timestamp":"2014-10-14T18:33:49Z",+
"readOnly":"TRUE",+
"value":"P478DT6H24M0.000S"+
},+
"licensePlate":{+
"state":"FL",+
"country":"US"+
},+
"trackableItemType":"VEHICLE",+
"fuelType":"DIESEL",+
"createdTimestamp":{+
"readOnly":true,+
"value":"2013-11-15T16:43:47Z"+
},+
"modifiedTimestamp":{+
"readOnly":true,+
"value":"2014-10-10T19:11:50Z"+
},+
}';
#js2_init();
rc = #js2_loadString(%addr(vString):%len(%trimr(vString)):errMsg);
if (rc > 0);
i = 1;
vElemData = 'id';
#js2_setValue('tag':vElemData);
v_id(i) = #js2_getDataStr(errMsg);
vElemData = 'vin';
#js2_setValue('tag':vElemData);
v_vin(i) = #js2_getDataStr(errMsg);
vElemData = 'odometer:value';
#js2_setValue('tag':vElemData);
v_odo(i) = #st_CtoN(#js2_getDataStr(errMsg));
vElemData = 'licensePlate:state';
#js2_setValue('tag':vElemData);
v_lpstate(i) = #js2_getDataStr(errMsg);
endif;
#js2_cleanup();
*INLR = *ON;
/end-free
As you can see there are a few new subprocedures included.
Processing a stream file looks like the following:
H DFTACTGRP(*NO) BNDDIR('BVSTOOLS')
****************************************************************
* Imports
****************************************************************
/COPY QCOPYSRC,P.JSON2
/COPY QCOPYSRC,P.STRINGS
****************************************************************
D MAX_VEHICLES C CONST(999)
*
D vElem S 65535 Varying
D vElemData S 65535 Varying
D errMsg S 256
D rc S 10i 0
D count S 10i 0
D i S 10i 0
*
D v_id S 128 DIM(MAX_VEHICLES)
D v_vin S 128 DIM(MAX_VEHICLES)
D v_odo S 13P 5 DIM(MAX_VEHICLES)
D v_lpstate S 2 DIM(MAX_VEHICLES)
********************************************************************
/free
#js2_init();
#js2_setValue('stmf':'/tmp/jsontestfiles/jsondata.json');
rc = #js2_loadStmf(errMsg);
if (rc > 0);
#js2_setValue('tag':'count');
count = #st_CtoN(#js2_getDataStr(errMsg));
for i = 1 to count;
vElem = 'vehicle[' + %char(i) + ']';
vElemData = vElem + ':id';
#js2_setValue('tag':vElemData);
v_id(i) = #js2_getDataStr(errMsg);
vElemData = vElem + ':vin';
#js2_setValue('tag':vElemData);
v_vin(i) = #js2_getDataStr(errMsg);
vElemData = vElem + ':odometer:value';
#js2_setValue('tag':vElemData);
v_odo(i) = #st_CtoN(#js2_getDataStr(errMsg));
vElemData = vElem + ':licensePlate:state';
#js2_setValue('tag':vElemData);
v_lpstate(i) = #js2_getDataStr(errMsg);
endfor;
endif;
#js2_cleanup();
*INLR = *ON;
/end-free
With this example the size of the stream file isn't an issue, unless it's over 16meg.
We will put together a new proof of concept soon as we're using this in our new application that will allow you to interact with your Microsoft OneDrive account. More on that later!
Brad