Translate

segunda-feira, 26 de junho de 2023

JSON no COBOL Mainframe : O Guia Definitivo para um Programador Padawan Entender Como o IBM Z Conversa com o Mundo Moderno

 

Bellacosa Mainframe e o json no cobol

☕ Um Café no Bellacosa Mainframe

JSON no COBOL Mainframe

O Guia Definitivo para um Programador Padawan Entender Como o IBM Z Conversa com o Mundo Moderno

"O COBOL nunca teve dificuldade em processar dados. O desafio sempre foi aprender novos idiomas. JSON é apenas mais um idioma."


Introdução

Durante décadas, o mundo Mainframe conversou utilizando formatos extremamente bem definidos.

Arquivos VSAM.

Registros fixos.

Copybooks.

Layouts COBOL.

MQ.

CICS COMMAREA.

IMS.

Tudo extremamente organizado.

Enquanto isso, o restante do mercado passou a utilizar um formato muito mais simples para troca de informações:

JSON (JavaScript Object Notation).

Hoje praticamente toda API REST utiliza JSON.

Aplicativos móveis.

Sites.

Microsserviços.

Open Banking.

Pix.

Cloud.

Inteligência Artificial.

ChatGPT.

IBM watsonx.

Todos utilizam JSON.

E é justamente por isso que um programador COBOL moderno precisa dominar este formato.

A boa notícia?

Desde o Enterprise COBOL V6, a IBM adicionou suporte nativo através dos comandos:

  • JSON PARSE

  • JSON GENERATE

Sem bibliotecas externas.

Sem escrever um parser manual.

Sem sofrimento.


O que é JSON?

JSON é simplesmente uma forma de representar dados usando pares:

nome : valor

Exemplo:

{
   "cliente": "João",
   "idade": 35,
   "saldo": 1250.75,
   "ativo": true
}

Perceba que ele lembra um registro COBOL.

No COBOL escreveríamos:

01 CLIENTE.
   05 NOME        PIC X(30).
   05 IDADE       PIC 9(3).
   05 SALDO       PIC 9(7)V99.
   05 ATIVO       PIC X.

A diferença é apenas o formato.


JSON x Copybook

Um copybook descreve campos.

JSON descreve informações.

Copybook:

05 NOME PIC X(30).

JSON

"nome":"Maria"

A IBM simplesmente faz o mapeamento entre ambos.


Estrutura básica

Um objeto:

{
   "nome":"Maria",
   "idade":28
}

Um vetor

{
   "telefones":[
      "1111",
      "2222"
   ]
}

Objeto dentro de objeto

{
   "cliente":{
      "nome":"Carlos",
      "cidade":"São Paulo"
   }
}

Tudo isso pode ser representado em COBOL.


Como declarar no COBOL

01 WS-CLIENTE.

   05 WS-NOME          PIC X(30).
   05 WS-IDADE         PIC 999.
   05 WS-SALDO         PIC 9(7)V99.
   05 WS-ATIVO         PIC X.

Agora um campo contendo o JSON.

01 WS-JSON.

   05 WS-DADOS PIC X(5000).

Este será o buffer utilizado para leitura ou gravação.


Lendo JSON

Imagine receber:

{
   "nome":"Luke",
   "idade":22,
   "saldo":1500.50,
   "ativo":"S"
}

Basta executar:

JSON PARSE WS-DADOS
     INTO WS-CLIENTE
END-JSON

Pronto.

A IBM faz todo o trabalho.

Após isso:

WS-NOME = LUKE

WS-IDADE = 22

WS-SALDO = 1500.50

WS-ATIVO = S

Sem IF.

Sem UNSTRING.

Sem parser.


Programa exemplo de leitura

IDENTIFICATION DIVISION.
PROGRAM-ID. JSONREAD.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-JSON.
   05 WS-DADOS PIC X(500).

01 WS-CLIENTE.
   05 WS-NOME PIC X(30).
   05 WS-IDADE PIC 999.
   05 WS-SALDO PIC 9(7)V99.
   05 WS-ATIVO PIC X.

PROCEDURE DIVISION.

MOVE
'{"nome":"Luke","idade":22,"saldo":1500.50,"ativo":"S"}'
TO WS-DADOS

JSON PARSE WS-DADOS
    INTO WS-CLIENTE
END-JSON

DISPLAY WS-NOME
DISPLAY WS-IDADE
DISPLAY WS-SALDO
DISPLAY WS-ATIVO

STOP RUN.

Como funciona internamente

O parser da IBM:

  1. lê caractere por caractere

  2. identifica as chaves

  3. procura o campo correspondente

  4. converte texto para número

  5. grava nas variáveis COBOL

Tudo automaticamente.


Gravando JSON

O caminho inverso também existe.

Suponha:

MOVE "ANA" TO WS-NOME

MOVE 30 TO WS-IDADE

MOVE 999.99 TO WS-SALDO

MOVE "S" TO WS-ATIVO

Agora:

JSON GENERATE WS-DADOS
    FROM WS-CLIENTE
END-JSON

Resultado:

{
   "nome":"ANA",
   "idade":30,
   "saldo":999.99,
   "ativo":"S"
}

Programa exemplo de geração

IDENTIFICATION DIVISION.
PROGRAM-ID. JSONWRITE.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-DADOS PIC X(1000).

01 WS-CLIENTE.

   05 WS-NOME PIC X(30).
   05 WS-IDADE PIC 999.
   05 WS-SALDO PIC 9(7)V99.
   05 WS-ATIVO PIC X.

PROCEDURE DIVISION.

MOVE "ANA" TO WS-NOME

MOVE 30 TO WS-IDADE

MOVE 1500.75 TO WS-SALDO

MOVE "S" TO WS-ATIVO

JSON GENERATE WS-DADOS
    FROM WS-CLIENTE
END-JSON

DISPLAY WS-DADOS

STOP RUN.

Gravando em arquivo

Após gerar o JSON basta gravá-lo normalmente.

WRITE REGISTRO-SAIDA

ou

STRING

WS-DADOS

DELIMITED BY SIZE

INTO REGISTRO

END-STRING

WRITE REGISTRO

Pode ser salvo em:

  • Sequential File

  • VSAM ESDS

  • UNIX USS

  • MQ

  • FTP

  • API REST

  • Kafka

  • IBM MQ

  • z/OS Connect


Tratando erros

Nunca assuma que o JSON está correto.

Utilize:

JSON PARSE
...
ON EXCEPTION

DISPLAY "JSON INVALIDO"

NOT ON EXCEPTION

DISPLAY "SUCESSO"

END-JSON

Isso evita que dados inválidos sejam processados.


Exemplo completo

JSON PARSE WS-DADOS

INTO WS-CLIENTE

ON EXCEPTION

MOVE "ERRO" TO WS-STATUS

NOT ON EXCEPTION

MOVE "OK" TO WS-STATUS

END-JSON

Arrays

JSON

{
 "produtos":[
   "Mouse",
   "Teclado",
   "Monitor"
 ]
}

COBOL

05 PRODUTO OCCURS 10 TIMES.

   10 NOME PIC X(30).

A IBM faz o relacionamento automaticamente quando os nomes e a estrutura são compatíveis.


Objetos aninhados

JSON

{
 "cliente":{
   "nome":"Carlos",
   "cidade":"Campinas"
 }
}

COBOL

01 CLIENTE.

   05 DADOS.

      10 NOME PIC X(30).

      10 CIDADE PIC X(20).

Valores opcionais

Nem sempre todos os campos existirão.

Exemplo

{
   "nome":"Pedro"
}

Sem idade.

Sem saldo.

Os campos COBOL permanecerão com seus valores iniciais (SPACES, ZEROS ou VALUE), por isso é importante inicializar a estrutura antes do JSON PARSE, geralmente com:

INITIALIZE WS-CLIENTE

Campos numéricos

Muito cuidado.

JSON

"idade":"ABC"

Jamais poderá alimentar

PIC 999

O parser gerará exceção.


Decimais

JSON

123.45

COBOL

PIC 9(5)V99

O ponto decimal é interpretado automaticamente conforme as regras do compilador e da representação numérica.


Booleanos

JSON

true
false

COBOL não possui um tipo booleano tradicional.

Uma prática comum é utilizar:

05 ATIVO PIC X.
   88 CLIENTE-ATIVO VALUE "S".
   88 CLIENTE-INATIVO VALUE "N".

Ou mapear para indicadores específicos conforme o padrão da aplicação.


Controle de tamanho

Um erro comum dos iniciantes.

Criar

PIC X(100)

para um JSON de

500 caracteres.

Resultado?

Truncamento.

Sempre dimensione com folga ou utilize áreas compatíveis com o tamanho esperado.


Performance

O parser da IBM é extremamente eficiente.

Mesmo assim:

  • Evite gerar JSON gigantescos.

  • Não faça PARSE repetidamente da mesma informação.

  • Reutilize áreas de trabalho.

  • Inicialize apenas quando necessário.

  • Evite cópias desnecessárias do buffer.


Armadilhas

Nomes diferentes

JSON

customerName

COBOL

CLIENTE-NOME

Não haverá correspondência automática sem mecanismos de mapeamento.


Campos obrigatórios

Nem sempre existirão.

Sempre valide.


Tipos incompatíveis

Número enviado como texto.

Texto enviado como número.

Boolean enviado como string.

São causas clássicas de erro.


Caracteres especiais

JSON utiliza UTF-8 com frequência.

Aplicações tradicionais em z/OS podem utilizar EBCDIC.

Em integrações, pode ser necessário converter a codificação antes do JSON PARSE ou após o JSON GENERATE.


Riscos

Os maiores riscos não estão no JSON.

Estão nos dados.

Por exemplo:

  • JSON malformado.

  • Dados incompletos.

  • Campos inesperados.

  • Tamanho excessivo.

  • Conteúdo malicioso.

  • Falhas de conversão de caracteres.

  • Exposição de informações sensíveis em logs.

Valide sempre a entrada e registre apenas o necessário.


Vantagens

Utilizar JSON no Mainframe oferece inúmeras vantagens:

  • integração simples com APIs REST;

  • comunicação natural com aplicações Java, .NET, Python e Node.js;

  • suporte a microsserviços;

  • facilidade de integração com nuvem;

  • menor necessidade de conversões proprietárias;

  • manutenção mais simples;

  • suporte nativo do Enterprise COBOL;

  • excelente desempenho quando comparado a parsers desenvolvidos manualmente.


Onde ele é utilizado?

Hoje praticamente em todos os projetos modernos.

  • Open Banking

  • PIX

  • Internet Banking

  • Aplicativos Mobile

  • APIs REST

  • IBM z/OS Connect

  • IBM API Connect

  • IBM MQ

  • Kafka

  • Cloud

  • Inteligência Artificial

  • IBM watsonx

  • Integrações híbridas entre IBM Z e plataformas distribuídas


Boas práticas

Um Padawan COBOL deve criar alguns hábitos desde o primeiro dia:

  • Inicialize as estruturas antes do processamento (INITIALIZE).

  • Utilize ON EXCEPTION e trate todos os erros.

  • Dimensione corretamente o buffer JSON.

  • Valide obrigatoriedade e formato dos campos.

  • Documente o layout esperado.

  • Mantenha os nomes consistentes entre JSON e estrutura COBOL sempre que possível.

  • Evite expor informações confidenciais em arquivos de log.

  • Teste com JSONs válidos, inválidos, incompletos e com dados extremos.


Conclusão

Durante muito tempo existiu o mito de que o Mainframe "não falava JSON". Isso deixou de ser verdade há anos. O Enterprise COBOL trouxe comandos nativos que simplificam enormemente a leitura e a geração desse formato, permitindo que aplicações escritas há décadas conversem com APIs modernas, serviços em nuvem, aplicações móveis e plataformas de Inteligência Artificial.

Para um Programador Padawan, aprender JSON significa abrir uma porta para o futuro sem abandonar os fundamentos que fazem do COBOL uma das linguagens mais confiáveis do mundo. Quem domina registros, copybooks e validação de dados aprenderá JSON rapidamente. A diferença está apenas na forma de representar a informação.

O verdadeiro desafio não é escrever JSON PARSE ou JSON GENERATE. É compreender a estrutura dos dados, validar corretamente o conteúdo recebido, tratar exceções, garantir compatibilidade de tipos e proteger informações sensíveis. Esses princípios sempre fizeram parte do desenvolvimento em Mainframe e continuam válidos na era das APIs.

No fim das contas, JSON não substitui o COBOL. Ele amplia sua capacidade de comunicação. E um IBM Z que conversa com o mundo moderno continua fazendo aquilo que sempre fez melhor: processar dados com segurança, desempenho e confiabilidade.


Sem comentários:

Enviar um comentário