Luciano,
Abaixo um exemplo de como utilizar a JsonObjec
t, tendo como origem uma string que contém um JSON, acessando propriedades do JSON via colchetes e com o auxílio também do método getNames
, por fim, transformo o JSON em uma string novamente com o método toJson
:
// ----------------------------------------------------------------------
/*/{Protheus.doc} jsonToString
Exemplo de como trabalhar com JsonObject
@sample U_jsonToString()
@author Daniel Mendes
@since 29/10/2020
@version 1.0
/*/
// ----------------------------------------------------------------------
user function jsonToString()
local cJson as char
local cRead as char
local cParser as char
local aNames as array
local aRetNames as array
local nX as numeric
local jJson
local jReturn
//Cria uma variável string com um conteúdo JSON
begincontent var cRead
{
"count": 1,
"position": null,
"next": null,
"returns": [
{
"id": 5,
"tipo_pessoa": "PF",
"nome": "John Smith",
"email": "jsmith@gmail.com",
"data_cadastro": "2020-04-23",
"hora_cadastro": "11:33:37",
"aprovador": false,
"negativado": false,
"motivo_negativo": null,
"contato": "Jorge Rael",
"cep": "80250-000",
"tipo": "Rua",
"endereco": "Nunes Machado",
"numero": "575",
"complemento": null,
"referencia": null,
"bairro": "Jardim X",
"cidade": "Curitiba",
"endereco_estado": "PR",
"endereco_ibge_uf": "41",
"endereco_ibge_municipio": "410690",
"endereco_ibge_municipio_verificador": "4106902",
"telefone1": "(18) 4444-9853",
"rg": "985985985",
"cpf": "222.222.222-22",
"data_nascimento": "1973-10-10",
"sexo": 2,
"cnpj": null,
"inscricao_estadual": null,
"revendedor": false,
"inscricao_estadual": "ISENTO",
"contato_pj": null,
"cpf_contato_pj": null,
"total_gasto": "420.00",
"quantidade_pedidos": 22,
"quantidade_pedidos_pagos": 2,
"ticket_medio": "222.50",
"grupos": []
}
]
}
endcontent
//Instancia do JSON
jJson := JsonObject():new()
//Efetua o parser do JSON que está na string
cParser := jJson:fromJson(cRead)
if cParser == nil
ConOut("JSON parseado corretamente:")
//Acessando o JSON via chaves
ConOut("count:", jJson["count"])
ConOut("position:", jJson["position"])
ConOut("next:", jJson["next"])
ConOut("returns:", jJson["returns"])
ConOut("returns[['id']]:", jJson["returns"][1]["id"])
//Pego as chaves do JSON via o método getNames
aNames := jJson:getNames()
ConOut("", "Quais dados existem no JSON?")
//Exibindo o nome da chave e o valor do JSON com o auxilio do retorno da getNames
for nX := 1 to Len(aNames)
ConOut(aNames[nX] + ":" + cValToChar(jJson[aNames[nX]]))
next
//Caso o returns não seja nulo, exibe seus valores no console
if jJson["returns"] != nil
//Pego o objeto JSON dentro do array de returns e trabalho com ele
jReturn := jJson["returns"][1]
aRetNames := jReturn:getNames()
//Exibindo o nome da chave e o valor do JSON com o auxilio do retorno da getNames
for nX := 1 to Len(aRetNames)
ConOut(aRetNames[nX] + ":" + cValToChar(jReturn[aRetNames[nX]]))
next
endif
//Deserializando o JSON
cJson := jJson:toJson()
//Exibe o conteúdo do JSON deserializado no console
ConOut("", "JSON deserializado:", cJson)
else
//Caso o parser falhe, exibe no console o erro do parser
ConErr("Erro no parser do JSON:", cParser)
endif
return
Espero que esse exemplo lhe ajude, qualquer dúvida, deixa um comentário que vou tentando lhe auxiliar! :)
Documentação:
https://tdn.totvs.com/display/tec/Classe+JsonObject
Luciano, eu utilizo a JsonObject e não tenho problemas na deserialização, ocorre algum erro? Consegue criar um POC sem o objeto de REST pra gente tentar reproduzir essa situação?
— Daniel Mendes 28 de Oct de 2020