Código: Selecionar todos
FUNCTION ShowJson( aHash, cTxt )
LOCAL oElement
IF ValType( aHash ) $ "NCDL" .OR. aHash == NIL
? cTxt, aHash
ELSEIF ValType( aHash ) == "A"
FOR EACH oElement IN aHash
ShowJson( oElement, cTxt + "[ " + Ltrim( Str( oElement:__EnumIndex ) ) + " ]" )
NEXT
ELSEIF ValType( aHash ) == "H"
FOR EACH oElement IN aHash
ShowJson( oElement, cTxt + '[ "' + hb_hKeyAt( aHash, oElement:__EnumIndex ) + '" ]' )
NEXT
ELSE
? cTxt, "***** nao identificado ***"
ENDIF
RETURN NIL
Voltando à função.
Até que ela não tem nada demais, mas é recursiva.
Ela pega CADA ELEMENTO da variável pra mostrar na tela.
Se o elemento for uma lista, array ou hash, vai chamando ela mesma pra mostrar os sub-elementos
Conforme faz isso, vai adicionando o nível no texto, pra ficar visível pra humanos.
Código: Selecionar todos
ELSEIF ValType( aHash ) == "A"
FOR EACH oElement IN aHash
ShowJson( oElement, cTxt + "[ " + Ltrim( Str( oElement:__EnumIndex ) ) + " ]" )
NEXT
Acima array, que é numerado de um em um, __EnumIndex é o número sequencial
Código: Selecionar todos
ELSEIF ValType( aHash ) == "H"
FOR EACH oElement IN aHash
ShowJson( oElement, cTxt + '[ "' + hb_hKeyAt( aHash, oElement:__EnumIndex ) + '" ]' )
NEXT
Acima hash, que ao invés de número é um texto, hb_hKeyAt() retorna o texto a partir do número sequencial
Vai repetindo isso até chegar no fundo do poço, até percorrer todos os níveis
isso é a recursividade que facilita.
Código: Selecionar todos
IF ValType( aHash ) $ "NCDL" .OR. aHash == NIL
? cTxt, aHash
Acima é quando não tem mais o que fazer, já chegou no fundo do poço, no nível mais baixo, e o retorno é um tipo conhecido.
Não sei se pode aparecer datetime, ou outro tipo novo, aí acrescentaria nessa lista.
Caso contrário, entra no "tipo desconhecido".