Adds a value, as UTF-8, to a JSON text.
JSONPUTVALUE(p,l[,v])
JSONPUTVALUE encodes the value (value of name-value pair) to UTF-8 and writes it to the buffer if there is sufficient space. If successful, it returns the number of bytes written. For a description of what a value is, see JSONGETVALUE.
The ERROR condition is raised if the JSON text buffer has insufficient space to accommodate the member. The ONCODE built-in function tells you why the ERROR condition was raised and the ONSUBCODE built-in function will indicate the number of bytes that were written. The number of bytes actually written will be <= l (second argument).
For a complete program using various JSON built-in functions, see the last example under JSONPUTVALUE.
Example 1:
Suppose Dcl Array(5) fixed bin(31) init(1, 2, 3, 4, 5);, then bytes = jsonputvalue (bufp, bufl, Array);
will have the following UTF-8 text at the beginning of the buffer: [1,2,3,4,5] (no spaces).
Example 2:
Suppose Dcl Towns fixed bin(31) init(6);, then bytes = jsonputvalue(bufp, bufl, Towns); will have the following UTF-8 text at the beginning of the buffer: 6
Example 3:
Suppose
dcl 1 S3,
2 fd(2),
3 d2 fixed bin(15) init(2, 4),
3 d5 fixed dec(7) init(5, 9);
then bytes = jsonputvalue (bufp, bufl, Array); will have the following UTF-8 text at the beginning of the buffer: {"FD":[{"D2":2,"D5":5},{"D2":4,"D5":9}]}.
Example 4:
Using the full program in example 5 below, you will see that:
Example 5:
The sample below is for illustrative purposes only. You will find the actual source code in the src folder in the product install directory.
package: package exports(*);
zzyzx: proc options(main);
%replace buf_size by 500;
dcl txt char(120) var;
dcl (Towns, bufl, bytes, ix) fixed bin(31);
dcl (bufp, Unusual_Town_Names_ptr) ptr;
dcl (buf, bufe) char(buf_size) var;
dcl err char(20);
dcl charvar_len fixed bin(15) based;
dcl 1 * union static,
3 * fixed bin(15) init(1),
3 *,
5 * char,
5 big char;
dcl 1 Unusual_Town_Names based(Unusual_Town_Names_ptr),
3 No_of_Towns fixed bin(31),
3 Details(Towns refer(No_of_Towns)),
5 No fixed bin(31),
5 Name char(30) varying,
5 Place char(30) varying,
5 Really bit;
on error
begin;
on error system;
put skip list('Bytes read=' || bytes, ' oncode=' ||
trim(oncode()) || ' onsubcode=' || trim(onsubcode()));
if onsubcode() ^= 0 then
do;
put skip list('JSON object invalid at pos ' ||
trim(onsubcode));
put skip list('<V---+----10---+----2>');
err = substr(buf, onsubcode());
if 'a' = 'a'e then
call pliebcdic(addr(err), addr(err), length(err));
put skip list('<' || err || '>');
end;
put skip list('bufl=', length(buf));
end;
if 'a' = 'a'e then put skip list('Running EBCDIC,');
else put skip list('Running ASCII,');
if big ^= '00'x then put list(' Bigendian.');
else put list(' Littleendian.');
bufe =
'{ "Towns": 6,
"Details" :
[
{ "No": 1, "Name": "Accident","Place": "Maryland", "Really":true},
{ "No": 2, "Name": "Boring", "Place": "Oregon", "Really": true},
{ "No": 3, "Name": "Dull", "Place": "Scotland","Really": true},
{ "No": 4, "Name": "Noplace", "Place": "England","Really": false},
{ "No": 5, "Name": "Why", "Place": "Arizona", "Really": true},
{ "No": 6, "Name": "Zzyzx", "Place":"California","Really":true}
]
}';
buf = utf8(bufe);
bufp = addrdata(buf);
bufl = length(buf);
bytes = jsonvalid(bufp, bufl);
if bytes ^= 0 then
do;
put skip list("Original JSON invalid at pos " || trim(bytes));
put skip list('<V---+----10---+----2>');
err = substr(buf, bytes);
put skip list('<' || err || '>');
end;
else
put skip list("Original JSON object is valid.");
/*===================================================================*/
/* Let's read the JSON object and populate Unusual_Town_Names */
/* structure, then create the JSON object again. After "call put", */
/* newly created JSON object should have exectaly the same content */
/* as the original except that all blanks will have been removed */
/*===================================================================*/
call get_n_list;
put skip list((70)'*');
put skip list('Using BUILTINs jsonput/get functions ...');
call put;
bytes = jsonvalid(bufp, bufl);
if bytes ^= 0 then
do;
put skip list("Newly created JSON invalid at pos " || trim(bytes));
put skip list('<V---+----10---+----2>');
err = substr(buf, bytes);
if 'a' = 'a'e then
call pliebcdic(addr(err), addr(err), length(err));
put skip list('<' || err || '>');
end;
else
put skip list("Newly created JSON object is valid.");
/*===================================================================*/
/* If all goes well, we should be able ot read it again */
/*===================================================================*/
call get_n_list;
/*===================================================================*/
/* We can re-create the entire object with just BUILTIN invocation */
/*===================================================================*/
put skip list((70)'*');
put skip list('Using BUILTINs jsonput/get VALUE ...');
bytes = jsonputvalue(bufp, buf_size, Unusual_Town_Names);
addr(buf)->charvar_len = bytes;
bufl = length(buf);
put skip list('Bytes Written=' || trim(bytes));
/*===================================================================*/
/* ... read the entire object with just one BUILTIN invocation */
/*===================================================================*/
bytes = jsongetvalue(bufp, bufl, Unusual_Town_Names);
put skip;
put skip list('Bytes Read=' || trim(bytes) ||
' Buffer Length=' || trim(bufl));
/*===================================================================*/
/* We can re-create the entire object with just BUILTIN invocation */
/* but with inclusion of the top lebel name */
/*===================================================================*/
put skip list((70)'*');
put skip list('Using BUILTINs jsonput/get MEMBER ...');
bytes = jsonputmember(bufp, buf_size, Unusual_Town_Names);
addr(buf)->charvar_len = bytes;
bufl = length(buf);
put skip list('Bytes Written=' || trim(bytes));
/*===================================================================*/
/* ... read the entire object with just one BUILTIN invocation */
/* but with inclusion of the top lebel name */
/*===================================================================*/
bytes = jsongetmember(bufp, bufl, Unusual_Town_Names);
put skip;
put skip list('Bytes Read=' || trim(bytes) ||
' Buffer Length=' || trim(bufl));
put skip list((70)'*');
put skip list('Done with the tests.');
/*===================================================================*/
get_n_list:proc;
bytes = jsongetobjectstart(bufp, bufl );
bytes += jsongetmember(bufp + bytes, bufl - bytes, Towns);
allocate Unusual_Town_Names;
bytes += jsongetcomma (bufp + bytes, bufl - bytes);
bytes += jsongetmember(bufp + bytes, bufl - bytes, Details);
bytes += jsongetobjectend(bufp + bytes, bufl - bytes);
do ix = 1 to towns;
txt = trim(no(ix)) || ' is ' || name(ix) || ', ' ||
place(ix) || '. ';
if really(ix) then
txt ||= "Yes it's true.";
else
txt ||= "It's false!.";
put skip list(txt);
end;
put skip;
put skip list('Bytes Read=' || trim(bytes) ||
' Buffer Length=' || trim(bufl));
end get_n_list;
/*===================================================================*/
put:proc;
bytes = jsonputobjectstart(bufp, buf_size );
bytes += jsonputmember(bufp + bytes, buf_size - bytes, Towns);
bytes += jsonputcomma(bufp + bytes, buf_size - bytes);
bytes += jsonputmember(bufp + bytes, buf_size - bytes, Details);
bytes += jsonputobjectend(bufp + bytes, buf_size - bytes);
addr(buf)->charvar_len = bytes;
bufl = length(buf);
put skip list('Bytes Written=' || trim(bytes));
put skip;
end put;
end zzyzx;
end package;
None.