Método HasProperty de JsonObject com propriedade dentro de propriedade

Existe alguma forma de utilizar o método HasProperty para verificar propriedade dentro de outras propriedades?

Exemplo:

Json:


{
    "nome": "TESTE INTEGRACAO ESL",
    "endereco" : {
        "uf" : "PR",
        "cep" : "82315000",
        "logradouro" : "Rua Angelo Massignan",
        "numero" : "884",
        "complemento" : "Ap 33, bloco 6",
        "bairro" : "São Braz"
    }
}

Código ADVPL:


oJson:HasProperty("endereco/uf)
// Ou
oJson:HasProperty("endereco:uf)

Olá,

É necessário acessar a propriedade endereco antes, como ela é um json, você pode utilizar o método HasProperty após acessá-la, algo assim:


jJson["endereco"]:hasProperty("uf")

Exemplos:


//-------------------------------------------------------------------
/*/{Protheus.doc} u_jsonProperty
Exemplo de verificação de propriedade

@author Daniel Mendes
@since Dec 04, 2023
@version 1.0
/*/
//-------------------------------------------------------------------
function u_jsonProperty()
local cJson as character
local jJson as json
local lHasUF as logical

begincontent var cJson
{
    "nome": "TESTE INTEGRACAO ESL",
    "endereco" : {
        "uf" : "PR",
        "cep" : "82315000",
        "logradouro" : "Rua Angelo Massignan",
        "numero" : "884",
        "complemento" : "Ap 33, bloco 6",
        "bairro" : "São Braz"
    }
}
endcontent

jJson := JsonObject():new()
jJson:fromJson(cJson)

//Com tripla validação, verificando o endereco, tipo do mesmo e após isso, o uf
lHasUF := jJson:hasProperty("endereco") .and. ValType(jJson["endereco"]) == "J" .and. jJson["endereco"]:hasProperty("uf")

ConOut("Existe a propriedade uf dentro da propriedade endereco?", lHasUF)

//Se você possuir certeza da existência do endereço, pode apenas validar a uf:
lHasUF := jJson["endereco"]:hasProperty("uf")

ConOut("Existe a propriedade uf dentro da propriedade endereco?", lHasUF)

//Como ao acessar uma propriedade que não existe, o json retorna nil, é possível apenas fazer o ValType de forma direta:
lHasUF := ValType(jJson["endereco"]) == "J" .and. jJson["endereco"]:hasProperty("uf")

ConOut("Existe a propriedade uf dentro da propriedade endereco?", lHasUF)

return

Documentação: https://tdn.totvs.com/display/tec/Classe+JsonObject

Obrigado, então tem quer ir verificando propriedade por propriedade. Vou fazer uma classe para facilitar esta verificação.