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-JSON

30.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-XML

30.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.