Deserializar JSON com a função JsonObject()

Prezados,

Por favor alguém conseguiu deserializar um Json com a função JsonObject na R25?

Estou utilizando o trecho abaixo, o cResponse recebe a string do JSon, a variável a ret recebe a string: "The parameter must be string", a variável array tem um item só no array, com a string "Count" que é a primeira coisa que ele encontra no Json e mais nada. Desde já agradeço qualquer ajuda.

cResponse := oRestClient:Get(aHeader) oJson := JsonObject():new() ret := oJson:fromJson(cResponse) array:= oJson:GetNames()

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?

Segue o arquivo, a minha dúvida é como deserializar esse arquivo Json.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Luciano,

Abaixo um exemplo de como utilizar a JsonObject, 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

Daniel, muito obrigado resolveu. Vlw mesmo.