JSON – O que é e como usar em AdvPL – Parte 02

Introdução

No post anterior  — JSON – O que é e como usar em AdvPL — vimos o que é JSON e como fazemos para ler um objeto / arquivo JSON em AdvPL ! Agora, vamos ver como criar e editar um objeto JSON em AdvPL 😀

Criando e/ou editando um JSON em AdvPL

Tão simples quanto ler, é criar ou editar um JSON ! Sim, é isso mesmo. A sintaxe direta de endereçar uma propriedade do Objeto JSON em AdvPL — vista no primeiro post — usando a sintaxe de “array” para endereçar propriedades ( oJson[‘propriedade’] ) também serve para fazer uma atribuição. Veja o exemplo abaixo, criando um objeto JSON em AdvPL e depois obtendo a string que o representa:

User Function JsonNew()

oJson := JSonObject():New()

oJson['Id'] := 0984
oJson['Nome'] := 'Júlio Wittwer'
oJson['Ok'] := .T.
oJson['Aniversario'] := ctod('03/03/1976')

oJson['Outros'] := JSonObject():New()
oJson['Outros']['Sangue'] := 'A+'
oJson['Outros']['Eleitor'] := .T.
oJson['Outros']['Reservista'] := .T.

conout(oJson:ToJson())

Return

Resultado obtido no console:

{“Outros”:{“Eleitor”:true,”Reservista”:true,”Sangue”:”A+”},”Id”:984,”Nome”:”Júlio Wittwer”,”Ok”:true,”Aniversario”:”1976/03/03″}

Ao criar um objeto, cada propriedade que receba uma atribuição é criada dinamicamente. Para criar um objeto como uma propriedade, usamos o construtor JsonObject():New(). Ao criarmos uma propriedade contento uma data em AdvPL, ela será criada no JSON como uma String, no formato AAAA/MM/DD. Os valores .T. (verdadeiro) e .F. (falso) em AdvPL viram respectivamente true e false no JSON. Podemos gerar a representação em texto/string do JSON usando o método toJson(). Consulte a documentação oficial do TDN, existe um método ( JsonObject:Set() ) que permite setar um array diretamente a um objeto JSON.

E para remover uma propriedade ?

Bem, eu acho que essa funcionalidade ainda está para ser criada … Em um JSON, “null” é um valor de propriedade. Logo, se fizermos uma atribuição do valor nulo em AdvPL (NIL) a uma determinada propriedade, ela será representada no JSON com o valor ‘null’, mas não será removida.

Por hora, remover uma propriedade do JSON pode ser feita de uma forma paliativa, atribuindo a uma propriedade um valor fixo, por exemplo a string “#delete#”, e depois de obter a string usando o método toJson(), localizar o texto a ser removido usando por exemplo a função at(), e remover a propriedade e o atributo remontando a string com substr() ou stuff(). — lembrando que uma propriedade pode estar iniciando um objeto, no meio dele, ou finalizado, e que se existe uma vírgula antes e/ou depois da tupla ( “propriedade”:”valor”, uma delas deve ser removida.

Demais considerações

Podemos trabalhar com objetos JSON inclusive maiores que 1MB — desde que você configure o MaxStringSize do Application Server para um novo limite — e com um desempenho muito bom em AdvPL. As sintaxes de acesso direto a propriedades permitem uma abordagem elegante, ágil e simples.

Conclusão

Espero que este conhecimento lhe seja útil, agradeço novamente pela audiência, e desejo a todos TERABYTES DE SUCESSO !!! ❤ Não deixe de consultar os links de referência no final do post. 

Referências

 

13 comentários sobre “JSON – O que é e como usar em AdvPL – Parte 02

  1. Júlio você recomendaria usar-la em locais que não precise do resultado json?
    Muitas vezes vejo a utilização de array com índice numérico uma forma complicada em utilizar para obter informação.
    Exemplo:
    aDados[1] := “NOME”
    aDados[2] := 12

    Em json
    jDados[“NOME”] := “NOME”
    jDados[“IDADE”] := 12

    Curtido por 1 pessoa

    • Humm … é uma idéia bem interessante 😀 Vou fazer alguns testes, eu sei que o acesso às propriedades é muito rápido, existem diferenças intrínsecas entre um array e o objeto JSON, ele pode consumir um pouco mais de memória do que um array, e a forma de iterar nele como um objeto teria que usar um GetNames(), mas não vejo nenhuma contra-indicação em usar dessa forma 😀

      Curtir

  2. Caro Júlio! Bom dia!

    Primeiro: Obrigado pelo conteúdo diverso e de primeira, tem ajudado muito e aberto meus olhos para as diversas possibilidades da linguagem ADVPL.

    Segundo: Seguindo uma tendência cada vez maior do mercado, tenho estudado sobre integrações de sistemas e ainda hoje vejo que esse assunto não é tão difundido em ADVPL como em outras linguagens, as informações são escassas e muitas vezes pouco exploradas.

    Minha sugestão de tema/estudo é falar sobre mensageria, para difundir o conceito de integração segura entre duas partes. Muitas vezes, as pessoas usam troca de arquivos ou Webservices para integrar o Protheus a um sistema legado, porém esses métodos não possuem segurança, garantia de entrega e controle de transações, algo que pode ser obtido (pelo menos em partes) com métodos de mensageria.

    Já fiz alguns testes com o componente de fila tAMQP pro Protheus, mas tem sido difícil achar material sobre o assunto… Se puder dar essa força, eu e outros tantos seremos muito gratos.

    Mais uma vez, agradeço pela disposição em transmitir seu conhecimento.

    Att,
    Wanderley R. Neto

    Curtido por 1 pessoa

  3. Júlio, Bom dia!

    Obrigado pelos posts! Esta sendo muito útil para mim, que nunca trabalhei com API, porém estou com uma dúvida. Tenho que montar o JSON na estrutura abaixo:
    {
    “acao”: “atender”,
    “numero”: 2020021077541 ,
    “mensagem”: “Pedido Recebido”,
    “form”:{
    “fields”:{
    “c6”: “Sim”,
    “c2”: “Sim”,
    “c140”: “Nao”,
    “c14”: “12/02/2020”
    }
    }
    }

    Quando insiro o último bloco, “fields”:{ “c6”: “Sim”, “c2”: “Sim”, “c140”: “Nao”, “c14”: “12/02/2020” } dentro do “form” apresenta a mensagem: Invalid variable attributes. Estou criando um objeto oFields e depois estou inserindo esse objeto dentro do oJson – oJson[“form”][“fields”] := oFields:GetJsonObject(“fields”) –
    É dessa forma que adiciono outros Objetos dentro do jSon ?

    Curtido por 1 pessoa

    • Opa, beleza ? Então … a atribuição parece estar correta, desde que oJson seja um objeto JSON, onde já exista a propriedade ‘form’, e ela já seja um objeto JSON. Normalmente criamos um objeto JSON como uma propriedade de um objeto já existente usando o construtor do objeto, por exemplo:

      oJson := JsonObject():New()
      oJson[‘form’] := JsonObject():New()
      oJson[‘form’][‘fields’] := JsonObject():New()
      oJson[‘form’][‘fields’][‘c6’] := ‘Sim’

      Espero ter ajudado 😀

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s