Hi all
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
JSON output
- September 21, 2022
- 7 replies
- 3 views
7 replies
- Rocketeer
- September 21, 2022
Hi all
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
SUBROUTINE GET.JSON.FIELD.SUB(D.NAME,ITXT,OTXT)
*
* Pass D.NAME: The name of the JSON element (key)
* ITXT: JSON string
*
* Return OTXT: Dynamic array in which each attribute contains the
* contents of a JSON value (string, number or special
* value), array or object associated with that key.
* Special values include "true", "false" or "null".
* There will be one attribute for each orccurence
* of searched-for key specified in D.NAME.
*
* This routine can be recalled on its own result string to extract
* nested data. For example, you can have a key "Customers" whose
* value is an object containing an array that contains three objects,
* each of which has the key "Customer" and contains "CustName",
* "CustPhone" and "CustEmail". To extract each customer's information
* one customer at a time, you would call the routine multiple times
* as follows:
*
* CALL GET.JSON.FIELD.SUB("Customer",JSONSTR,SUBSTR)
* ATTR.CNT = DCOUNT(SUBSTR,@AM)
* FOR AX = 1 TO ATTR.CNT
* CALL GET.JSON.FIELD.SUB("CustName",SUBSTR<AX>,CNAME)
* CALL GET.JSON.FIELD.SUB("CustPhone",SUBSTR<AX>,PHONE)
* GOSUB UpdatePhoneList
* NEXT AX
*
* You can also bypass the extraction of the container objects
* by searching for a key that occurs within the container object
* one or more times and return the value only, like so:
*
* CALL GET.JSON.FIELD.SUB("CustEmail",JSONSTR,EMAILS)
* ATTR.CNT = DCOUNT(EMAILS,@AM)
* FOR AX = 1 TO ATTR.CNT
* EMAIL = EMAILS<AX>
* GOSUB ProcessEmail
* NEXT AX
*
*
WTXT=ITXT ;* ITXT should remain untouched.
;* Move it to WTXT and remove trivial characters
CONVERT @AM:@VM:@SVM:CHAR(9):CHAR(10):CHAR(13) TO "" IN WTXT
OTXT="" ;* Set up return dynamic array, its subscript,
OTXT.X=0 ;* the input string length and the search
WTXT.LEN=LEN(WTXT) ;* argument in double quotes
SEARCH.NAME=\\"\\:D.NAME:\\"\\
SEARCH.LEN=LEN(SEARCH.NAME)
*
FOR IPOS=1 TO WTXT.LEN
IF WTXT[IPOS,SEARCH.LEN]=SEARCH.NAME THEN ;* found name
IPOS+=SEARCH.LEN
FOUND.DELIM=INDEX(WTXT[IPOS,WTXT.LEN],\\:\\,1)
IF FOUND.DELIM ELSE GO SubroutineMainExit
IPOS+=FOUND.DELIM
FOUND.CHAR=""
FOUND.BEG=""
FOUND.LEN=""
SEARCH.CHAR=""
WQUOTE=INDEX(WTXT[IPOS,WTXT.LEN],\\"\\,1)
WBRACE=INDEX(WTXT[IPOS,WTXT.LEN],\\{\\,1)
WBRACK=INDEX(WTXT[IPOS,WTXT.LEN],\\[\\,1)
WCOMMA=INDEX(WTXT[IPOS,WTXT.LEN],\\,\\,1)
IF WQUOTE ELSE WQUOTE=WTXT.LEN
IF WBRACE ELSE WBRACE=WTXT.LEN
IF WBRACK ELSE WBRACK=WTXT.LEN
IF WCOMMA ELSE WCOMMA=WTXT.LEN
IF WCOMMA<WQUOTE AND WCOMMA<WBRACE AND WCOMMA<WBRACK THEN
OTXT.X+=1
OTXT<OTXT.X>=TRIM(WTXT[IPOS,WCOMMA-1])
END ELSE
LOOP WHILE FOUND.CHAR="" DO
WCH=WTXT[IPOS,1]
BEGIN CASE
CASE IPOS>WTXT.LEN
EXIT
CASE WCH="{"
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR="}"
CASE WCH=\\"\\
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR=WCH
CASE WCH="["
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR="]"
END CASE
IPOS+=1
REPEAT
IF FOUND.CHAR="" THEN GO SubroutineMainExit
FOUND.COUNT=1
LOOP WHILE FOUND.COUNT>0 DO
WCH=WTXT[IPOS,1]
BEGIN CASE
CASE IPOS>WTXT.LEN
EXIT
CASE WCH=SEARCH.CHAR
FOUND.COUNT-=1
IF FOUND.COUNT<1 THEN
FOUND.LEN=(IPOS-FOUND.BEG)+1
IF SEARCH.CHAR=\\"\\ THEN
FOUND.BEG+=1
FOUND.LEN-=2
END
OTXT.X+=1
OTXT<OTXT.X>=WTXT[FOUND.BEG,FOUND.LEN]
END
CASE WCH=FOUND.CHAR
FOUND.COUNT+=1
END CASE
IPOS+=1
REPEAT
END
END
NEXT IPOS
*
SubroutineMainExit:
RETURN
*
* End of source------------------------------
Brian S. Cram
Principal Technical Support Engineer
Rocket Software
------------------------------
- Author
- Participating Frequently
- September 21, 2022
We do not have anything inside D3 ( 10.4 or earlier ) that natively creates JSON. We have the MVS Toolkit, our REST services tool, that will do that for you as middleware, and I've written a JSON field locater Pick BASIC subroutine:
------------------------------
Brian S. Cram
Principal Technical Support Engineer
Rocket Software
------------------------------
SUBROUTINE GET.JSON.FIELD.SUB(D.NAME,ITXT,OTXT)
*
* Pass D.NAME: The name of the JSON element (key)
* ITXT: JSON string
*
* Return OTXT: Dynamic array in which each attribute contains the
* contents of a JSON value (string, number or special
* value), array or object associated with that key.
* Special values include "true", "false" or "null".
* There will be one attribute for each orccurence
* of searched-for key specified in D.NAME.
*
* This routine can be recalled on its own result string to extract
* nested data. For example, you can have a key "Customers" whose
* value is an object containing an array that contains three objects,
* each of which has the key "Customer" and contains "CustName",
* "CustPhone" and "CustEmail". To extract each customer's information
* one customer at a time, you would call the routine multiple times
* as follows:
*
* CALL GET.JSON.FIELD.SUB("Customer",JSONSTR,SUBSTR)
* ATTR.CNT = DCOUNT(SUBSTR,@AM)
* FOR AX = 1 TO ATTR.CNT
* CALL GET.JSON.FIELD.SUB("CustName",SUBSTR<AX>,CNAME)
* CALL GET.JSON.FIELD.SUB("CustPhone",SUBSTR<AX>,PHONE)
* GOSUB UpdatePhoneList
* NEXT AX
*
* You can also bypass the extraction of the container objects
* by searching for a key that occurs within the container object
* one or more times and return the value only, like so:
*
* CALL GET.JSON.FIELD.SUB("CustEmail",JSONSTR,EMAILS)
* ATTR.CNT = DCOUNT(EMAILS,@AM)
* FOR AX = 1 TO ATTR.CNT
* EMAIL = EMAILS<AX>
* GOSUB ProcessEmail
* NEXT AX
*
*
WTXT=ITXT ;* ITXT should remain untouched.
;* Move it to WTXT and remove trivial characters
CONVERT @AM:@VM:@SVM:CHAR(9):CHAR(10):CHAR(13) TO "" IN WTXT
OTXT="" ;* Set up return dynamic array, its subscript,
OTXT.X=0 ;* the input string length and the search
WTXT.LEN=LEN(WTXT) ;* argument in double quotes
SEARCH.NAME=\\"\\:D.NAME:\\"\\
SEARCH.LEN=LEN(SEARCH.NAME)
*
FOR IPOS=1 TO WTXT.LEN
IF WTXT[IPOS,SEARCH.LEN]=SEARCH.NAME THEN ;* found name
IPOS+=SEARCH.LEN
FOUND.DELIM=INDEX(WTXT[IPOS,WTXT.LEN],\\:\\,1)
IF FOUND.DELIM ELSE GO SubroutineMainExit
IPOS+=FOUND.DELIM
FOUND.CHAR=""
FOUND.BEG=""
FOUND.LEN=""
SEARCH.CHAR=""
WQUOTE=INDEX(WTXT[IPOS,WTXT.LEN],\\"\\,1)
WBRACE=INDEX(WTXT[IPOS,WTXT.LEN],\\{\\,1)
WBRACK=INDEX(WTXT[IPOS,WTXT.LEN],\\[\\,1)
WCOMMA=INDEX(WTXT[IPOS,WTXT.LEN],\\,\\,1)
IF WQUOTE ELSE WQUOTE=WTXT.LEN
IF WBRACE ELSE WBRACE=WTXT.LEN
IF WBRACK ELSE WBRACK=WTXT.LEN
IF WCOMMA ELSE WCOMMA=WTXT.LEN
IF WCOMMA<WQUOTE AND WCOMMA<WBRACE AND WCOMMA<WBRACK THEN
OTXT.X+=1
OTXT<OTXT.X>=TRIM(WTXT[IPOS,WCOMMA-1])
END ELSE
LOOP WHILE FOUND.CHAR="" DO
WCH=WTXT[IPOS,1]
BEGIN CASE
CASE IPOS>WTXT.LEN
EXIT
CASE WCH="{"
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR="}"
CASE WCH=\\"\\
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR=WCH
CASE WCH="["
FOUND.CHAR=WCH
FOUND.BEG=IPOS
SEARCH.CHAR="]"
END CASE
IPOS+=1
REPEAT
IF FOUND.CHAR="" THEN GO SubroutineMainExit
FOUND.COUNT=1
LOOP WHILE FOUND.COUNT>0 DO
WCH=WTXT[IPOS,1]
BEGIN CASE
CASE IPOS>WTXT.LEN
EXIT
CASE WCH=SEARCH.CHAR
FOUND.COUNT-=1
IF FOUND.COUNT<1 THEN
FOUND.LEN=(IPOS-FOUND.BEG)+1
IF SEARCH.CHAR=\\"\\ THEN
FOUND.BEG+=1
FOUND.LEN-=2
END
OTXT.X+=1
OTXT<OTXT.X>=WTXT[FOUND.BEG,FOUND.LEN]
END
CASE WCH=FOUND.CHAR
FOUND.COUNT+=1
END CASE
IPOS+=1
REPEAT
END
END
NEXT IPOS
*
SubroutineMainExit:
RETURN
*
* End of source------------------------------
Brian S. Cram
Principal Technical Support Engineer
Rocket Software
------------------------------
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
- Participating Frequently
- September 22, 2022
Hi all
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
------------------------------
Alex Polglaze
The Book-Keeping Network
Perth Western Australia
+61419 776 348
apolglaze@book-keepingnetwork.com.au
https://www.book-keepingnetwork.com.au/
------------------------------
- Author
- Participating Frequently
- September 23, 2022
Methinks life would be so much easier with an SB+ upgrade.
------------------------------
Alex Polglaze
The Book-Keeping Network
Perth Western Australia
+61419 776 348
apolglaze@book-keepingnetwork.com.au
https://www.book-keepingnetwork.com.au/
------------------------------
------------------------------
Alex Polglaze
The Book-Keeping Network
Perth Western Australia
+61419 776 348
apolglaze@book-keepingnetwork.com.au
https://www.book-keepingnetwork.com.au/
------------------------------
There was no notion of "an upgrade" as such. But, yes SB+ may be considered.
Thanks :)
Stefano
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
- Participating Frequently
- September 23, 2022
@Alex Polglaze Just to put things into context; the exercise was one merely to see how far I could push my HTML / CSS skills from a character-based screen.
There was no notion of "an upgrade" as such. But, yes SB+ may be considered.
Thanks :)
Stefano
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
There was no notion of "an upgrade" as such. But, yes SB+ may be considered.
Thanks :)
Stefano
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
------------------------------
Alex Polglaze
The Book-Keeping Network
Perth Western Australia
+61419 776 348
apolglaze@book-keepingnetwork.com.au
https://www.book-keepingnetwork.com.au/
------------------------------
- New Participant
- October 19, 2022
Hi all
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
I associate a branch count with the node values and (in a pickish fashion) stack the counts and count my way through them.
------------------------------
Robert Davenport
Programmer
Custom Language Solutions
Auckland NZ
------------------------------
- New Participant
- November 18, 2022
Hi all
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
Has 10.4 (or lower) got the ability (function) to create (and read) JSON ? (I know that OpenInsight has)
If not, is anyone prepared to share their version of such a function that they may have created?
I have written something to extract System Builder screens to convert them (into JSON) to HTML pages (using Python) but it may be interesting how others have approached this.
Thanks
------------------------------
Stefano Gallotta
Managing Member
Simply Red Open Systems
Milnerton ZA
------------------------------
! This program demonstrates how raw json can be displayed
! in a readable format using the python json.dumps() module.
! I am only using the "indent" option with json.dumps().
!
! Over all steps
! 1. Read the json to be converted
! 2. Setup or read the python script
! 3. Swap in the json to the script
! 4. Open a Linux directory
! 5. Write the python script to the directory
! 6. Make the script executable
! 7. Execute the python script with output to the screen (may be captured)
! 8. Or write the reply to a file for visual review by editing it
!
! Take the json and set it to a variable (read from a file)
! This should be only in the first attribute.
raw.json = \\{"name":"John","age":30,"married":True,"divorced":False,"children":("Ann","Billy"),"pets":None,"cars":[{"model":"BMW 230","mpg":27.5},{"model":"Ford Edge","mpg":24.1}]}\\
!
! Body
!
! Python script (may be read from a file)
python = "#!/usr/bin/python2"
python<2> = \\import json\\
python<3> = \\answer = (json.dumps(raw.json, indent=4))\\
python<4> = \\print (answer)\\
python = swap(python,"raw.json",raw.json)
!
! Open the directory (this can be any directory that you have access to)
open "/tmp" to tmp.dir else crt "cannot open /tmp"; stop
!
! Write the script to the home directory
write python on tmp.dir,"ext.json.py"
!
! Make the script executable
execute "!chmod 755 /tmp/ext.json.py"
!
! Execute the script with output to the screen
execute "!/tmp/ext.json.py"
!
! Or, you may edit output for review
! Write the output to a file for viewing
execute "!/tmp/ext.json.py" capturing reply
write reply on tmp.dir,"reply.json"
!
! Edit the output
data "p"
execute "ed /tmp reply.json"
end
------------------------------
Ted Hurlbut
DBA
AMECO - American Equipment Co
Greenville SC US
------------------------------
Recent badge winners
Doug Averchhas earned the badge Consistent Trajectory
Neil Morrishas earned the badge Consistent Trajectory
Kevin Hondhas earned the badge Orbit Established
Kevin Hondhas earned the badge Consistent Trajectory
OsmanShariffhas earned the badge Network Contributor
Sign up
Already have an account? Login
Welcome to the Rocket Forum!
Please log in or register:
Employee Login | Registration Member Login | RegistrationEnter your E-mail address. We'll send you an e-mail with instructions to reset your password.
Scanning file for viruses.
Sorry, we're still checking this file's contents to make sure it's safe to download. Please try again in a few minutes.
OKThis file cannot be downloaded
Sorry, our virus scanner detected that this file isn't safe to download.
OK