Tipagem de Json no TL++

Boa tarde!

Comecei a desenvolver em TL++ há pouco tempo e estou com uma dúvida quanto a tipagem de Jsons em TLPP.

Observe o exemplo a seguir:

tlpp_tipagem.PNG

Primeiramente ele aponta um erro de tipo incompatível ao preencher um Json que está dentro do array. Se eu altero o tipo da variável aList para Object, esse erro deixa de acontecer. Mas ela não seria um Array antes de ser um Object/Json? Essa validação está correta?

Segundo ele aponta um erro de tipo incompatível ao acessar a primeira posição do Json. Este erro não acontece se eu acesso a chave da primeira posição. Exemplo: jRet[1, 'letras']. Essa validação também está correta?

Grato pela ajuda.

Estou utilizando a extensão oficial do TDS no VsCode.

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

Giordano, pelo que verifiquei seu código realmente deveria funcionar da forma que está. O que deve estar ocorrendo é uma particularidade desse novo tipo de dados Json onde o mesmo tem vários tratamentos internos para funcionar e por isso muda um pouco o funcionamento do código.

Eu fiz pequenas alterações no fonte que corrigem essas inconsistências. Talvez alguém mais experiente aqui no fórum como o Daniel possam explicar os motivos dessa sutil diferença.


#INCLUDE 'TOTVS.CH'
#INCLUDE 'TLPP-CORE.TH'

User Function FTLPP()

    Local aList     As Array
    Local jRet      As Json
    Local nLenght   As Numeric
    Local cJson     As Character

    aList   := {}
    jRet    := JsonObject():New()

    // Adiciona um Json ao array
    aAdd(aList, JsonObject():New())

    nLenght := Len(aList)

    aList[nLenght]['letras'] := 'ABCDE'
    aList[nLenght]['numeros'] := '12345'

    // Adiciona o array no Json
    jRet:Set(aList)

    // Obtém o primeiro array do Json
    cJson := jRet[1]:ToJson()

Return

Opa, obrigado Cirilo! Interessante, não sabia que dava pra tipar o Json diretamente como Json. Realmente dessa forma funcionou corretamente.

Olá,

Isso é uma limitação do binário.

Como sua variável está tipada como array, ele compreende que você só acessa índices de array com números ou variants, gerando assim o erro de compilação.

Você pode tipar a sua variável aList como Variant e esse erro deixará de ocorrer:


Local aList As Variant

Apesar de ser possível, eu não acho a melhor solução. Acho que fica muito mais claro, você manter a tipagem correta como array e acessar o índice do array e a chave do json de forma separada, assim como o exemplo do Cirilo:


aList[nLenght]['letras'] := 'ABCDE'

Dessa forma o código continua legível e a tipagem se mantem correta.

Quanto a ultimo erro, na chamada do método toJson, é apenas um erro de tipagem do seu código mesmo. Você tipou o Json como Object e isso está errado, você acaba tentando acessar o índice de um variável que para o compilador é um objeto e isso não existe. Se você corrigir a tipagem, mudando a mesma para Json, esse erro já será solucionado (O exemplo do Cirilo também consta essa correção):


Local jRet As Json

O compilador está ficando cada vez mais crítico quanto a verificação de código quando o mesmo está tipado, lembrando que é possível tipar variáveis, parâmetros, métodos, propriedades e funções.

Documentação: https://tdn.totvs.com/pages/viewpage.action?pageId=579304379

Obrigado pela explicação, Daniel. Apenas uma dúvida: a tipagem em Json também funciona em AdvPL ou apenas em TL++?

ADVPL permite a tipagem, mas não tem o mesmo resultado que em TLPP, eu particularmente tipo JSON em ADVPL para melhorar a leitura do código.
A tipagem em ADVPL continua mais branda para evitar problemas com o legado.

Thnx for sharing this information plz visit this site: https://sites.google.com/cryptwalleto.com/atomic-wallet/home/ |https://sites.google.com/cryptwalleto.com/icytools/home |