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:
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.
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.