JSON & XML
IBM Enterprise COBOL 6.1+ (GENERATE) and 6.2+ (PARSE).
30.1 JSON GENERATE
IBM Enterprise COBOL 6.1+ (GENERATE) and 6.2+ (PARSE). GnuCOBOL 3.x implements JSON GENERATE and XML GENERATE when built with the optional JSON (cJSON/json-c) and XML (libxml2) libraries — check cobc --info.
Result (trailing spaces of alphanumeric fields are trimmed):
01 CUSTOMER.
05 CUST-ID PIC 9(6) VALUE 100123.
05 CUST-NAME PIC X(20) VALUE "Ada Lovelace".
05 CUST-BALANCE PIC S9(7)V99 VALUE 2500.75.
05 CUST-ACTIVE PIC X VALUE "Y".
01 WS-JSON-OUT PIC X(500).
01 WS-JSON-LEN PIC 9(5) COMP.
* ...
JSON GENERATE WS-JSON-OUT FROM CUSTOMER
COUNT IN WS-JSON-LEN
NAME OF CUST-ID IS "id"
CUST-NAME IS "name"
CUST-BALANCE IS "balance"
SUPPRESS CUST-ACTIVE
ON EXCEPTION
DISPLAY "JSON GENERATE failed, JSON-CODE=" JSON-CODE
NOT ON EXCEPTION
DISPLAY WS-JSON-OUT(1:WS-JSON-LEN)
END-JSON{"CUSTOMER":{"id":100123,"name":"Ada Lovelace","balance":2500.75}}30.2 JSON PARSE (IBM Enterprise COBOL)
JSON-CODE and JSON-STATUS special registers report problems (missing or unmatched names, truncation). Encoding matters on z/OS: alphanumeric JSON text is interpreted in the compile-time CODEPAGE (EBCDIC); UTF-8 or national receivers are used when exchanging data with web services.
01 WS-JSON-IN PIC X(200) VALUE
'{"CUSTOMER":{"id":200456,"name":"Alan Turing",'
& '"balance":-12.50}}'.
* ...
JSON PARSE WS-JSON-IN INTO CUSTOMER
WITH DETAIL
NAME OF CUST-ID IS "id"
CUST-NAME IS "name"
CUST-BALANCE IS "balance"
SUPPRESS CUST-ACTIVE
ON EXCEPTION
DISPLAY "JSON PARSE error, JSON-CODE=" JSON-CODE
END-JSON30.3 XML GENERATE
WS-XML-OUT is a large PIC X buffer and WS-XML-LEN a binary count, as for JSON. WITH ATTRIBUTES emits elementary items as attributes where possible; NAME OF ... IS, TYPE OF ... IS ATTRIBUTE/ELEMENT/CONTENT, NAMESPACE, and SUPPRESS customize the output.
XML GENERATE WS-XML-OUT FROM CUSTOMER
COUNT IN WS-XML-LEN
WITH XML-DECLARATION WITH ATTRIBUTES
ON EXCEPTION DISPLAY "XML-CODE=" XML-CODE
END-XML30.4 XML PARSE (event-based)
XML PARSE is a SAX-style parser: it calls your processing procedure for each event.
Other events include START-OF-DOCUMENT, ATTRIBUTE-NAME, ATTRIBUTE-CHARACTERS, and END-OF-DOCUMENT. Enterprise COBOL uses the z/OS XML System Services parser (XMLPARSE(XMLSS)), which supports namespaces and validation against schemas (VALIDATING WITH).
01 WS-XML-DOC PIC X(200) VALUE
'<order id="77"><item>Widget</item><qty>5</qty></order>'.
01 WS-CURRENT-ELEMENT PIC X(30).
01 WS-ITEM PIC X(30).
01 WS-QTY PIC 9(5).
* ...
XML PARSE WS-XML-DOC
PROCESSING PROCEDURE IS 5000-XML-HANDLER
ON EXCEPTION
DISPLAY "XML PARSE error, XML-CODE=" XML-CODE
END-XML
DISPLAY "Item " WS-ITEM " quantity " WS-QTY
GOBACK.
5000-XML-HANDLER.
EVALUATE XML-EVENT
WHEN "START-OF-ELEMENT"
MOVE XML-TEXT TO WS-CURRENT-ELEMENT
WHEN "CONTENT-CHARACTERS"
EVALUATE WS-CURRENT-ELEMENT
WHEN "item"
MOVE XML-TEXT TO WS-ITEM
WHEN "qty"
COMPUTE WS-QTY = FUNCTION NUMVAL(XML-TEXT)
END-EVALUATE
WHEN "END-OF-ELEMENT"
MOVE SPACES TO WS-CURRENT-ELEMENT
END-EVALUATE.