Qual a diferença de inicializar uma variável local com `Local jDadosJson as Json` e `Local jDadosJson := JsonObject():new()`?

Eu estou iniciando agora no mundo do ADVPL e TLPP, gostei bastante do TLPP pois é muito parecido com C# e Spring Boot... Porém como tem pouca documentação, tem algumas coisas que eu estou tendo duvidas.

Essa é uma delas, eu sei que é bem básica e eu acho que é a mesma coisa, mas como percebi que essa linguagem possui algumas peculiaridades, eu gostaria de saber da comunidade...

Tenho o seguinte método @get no código:


Method get() as Logical Class SolicitacaoArmazemController

    // Setar Empresa e Filial no começo do App (Necessário)
    rpcSetEnv(cEmpAnt, cFilAnt)

    ConOut("SolicitacaoArmazemController:get - Coletando os Parametros da Query e do JSON Body")

    Local jParam as Json
    Local jBody := JsonObject():new()

    jParam := oRest:getQueryRequest()

    /* 
    NOTA sobre o Local jBody:

    Atribui o VALOR do PARAMETRO NO JSON enviado no BODY para uma VARIAVEL Local pra printar no Log.
    O JSON enviado de exemplo foi:

    {
        "parametro": "Teste"
    }

    Deve printar "Teste".

    Documentação do Body: https://tdn.totvs.com/display/tec/Body

    */

    jBody:fromJson( oRest:GetBodyRequest() )
    If ( jBody <> Nil)
        cParametroNoJson := jBody:GetJsonText("parametro")
        If ( cParametroNoJson == "null" )
            cParametroNoJson := Nil
        Else
            ConOut("SolicitacaoArmazemController:get - Parametro no JSON: " + cParametroNoJson)
        EndIf
    EndIf

    ConOut("SolicitacaoArmazemController:get - Configurando os Headers e a Response")
    oRest:setKeyHeaderResponse('Content-Type', 'application/json; charset=utf-8')    
    oRest:setResponse(cResponseJson)

    // Resetar a Empresa/Filial e liberar licenças utilizadas.
    rpcClearEnv()

Return .T.

Eu iniciei as variáveis locais jParame jBody de formas diferentes de propósito, pois eu gostaria de saber se ao usar as Json é só uma forma mais direta de fazer JsonObject():new()...

Qual a diferença entre as duas sintaxes? É a mesma coisa?

1 curtida

Raul,

O ADVPL tem uma tipagem fraca, que permite inclusive a troca do tipo, gerando apenas warning de compilação.

O TLPP teve alterações para que a tipagem seja mais forte, gerando inclusive erros de compilação ao tipar uma variável e depois mudar o seu tipo.


Ao tipar uma variável em TLPP, dependendo do tipo, você já tem um conteúdo padrão, por exemplo, ao tipar uma variável como numeric, sua variável já nasce com o valor 0.

Respondendo seu exemplo, não é a mesma coisa! O JSON não tem inicialização de valor, logo:


Local jParam as Json
Local jBody := JsonObject():new()

Você vai ter:

  • jParam - Tipada como JSON, permitindo apenas JSON como conteúdo, mas de valor nil | ValType = U
  • jBody - Sem tipagem, permitindo colocar 0, .T. entre outros, mas atualmente com um JSON | ValType = J

E sim, tudo isso está documentado:

https://tdn.totvs.com/display/tec/Tipagem+em+TLPP

Entendi. Muito obrigado Daniel!