Clipper On Line • Ver Tópico - Pegar segunda chave dentro de um JSON
Página 1 de 1

Pegar segunda chave dentro de um JSON

MensagemEnviado: 18 Set 2020 10:15
por gilbertosilverio
Olá Amigos,

Como faço para pegar os valores de um hash, no meu caso, vou baixar um arquivo de cotações, e dentro existem diversos itens, já tentei de todas as forma e não consigo pegar estes itens.

FUNCTION JSON_GTPLAN()
   LOCAL hRet:=HB_Hash(), cRet:='', oELEMENTO, oELEMENTO1, a01, a02
   cRET:=MEMOREAD( [C:\GTPLAN.TXT] )
   hb_JsonDecode( cRet, @hRet )

   If Len(hRet) != 0
      If HB_HHasKey( hRet, 'bids' )
         For EACH oElemento IN hRet['bids']
             A01 := oElemento["id_bid"]
             hwg_msginfo(a01)
             IF HB_HHasKey( hRet, 'items'  )
                For EACH oElemento1 IN hRet['items']
                    A02 := oElemento1['id_bid_item']
                    hwg_msginfo(a02)
                NEXT
             ELSE
                HWG_MSGINFO([Nao achei])
             ENDIF
         Next
      Else
         hwg_msginfo('ERRO: '+hb_UTF8ToStr(hRet['Msg']))
      Endif
   Else
      hwg_msginfo('ERRO: Erro no Envio da Chave')
   EndIf
RETURN



Baseado em exemplos aqui do site, montei esta rotina, mais infelizmente não consigo entender como pegar o que esta na segunda chave.

Agradeço a ajuda de como fazer esta captura.

Pegar segunda chave dentro de um JSON

MensagemEnviado: 18 Set 2020 11:02
por Vlademiro
Os itens são arrays. Veja que são colchetes. E cada elemento do array é um hash. Então vc não pode acessar diretamente o hash. Precisa iterar o array primeiro.

Use a função hb_valtoexp para analisar o item retornado pelo for each. Essa função ajuda na criação de rotinas porque te mostra o conteúdo do elemento.

Pegar segunda chave dentro de um JSON

MensagemEnviado: 18 Set 2020 13:02
por JoséQuintas
Repetindo o que já comentei em outro post:

Array são listas, identificadas por número.
CADA uma dessas listas pode ser qualquer coisa, inclusive outra lista.

Hash Array também são listas, identificadas por texto.
CADA uma dessas listas pode ser qualquer coisa, inclusive outra lista.

Json com certeza é a mistura de tudo.

Então você pode ter uma lista:

a[ 1 ]
a[ 2 ]
a[ 3 ]

ou uma lista:

b[ "CODIGO" ]
b[ "NOME" ]
b[ "ENDERECO" ]

E na mistura, você pode ter uma lista igual A contendo listas iguais B, ou uma lista igual B contendo listas iguais A.

a[ 1 ] contendo a[ 1 ][ "CODIGO" ] por exemplo
Um FOR EACH vai passear por a[ 1 ], a[ 2 ] e a[ 3 ] que contém hash array
FOR EACH oElement IN a
? oElement[ "CODIGO" ]
NEXT

ou

a[ "CODIGO ] contendo a[ "CODIGO" ][ 1 ] por exemplo
Um FOR EACH vai passear por a[ "CODIGO" ], a[ "NOME" ], a[ "ENDERECO" ] que contém um array
FOR EACH oElement IN a
? oElement[ 1 ]
NEXT

E como dá pra ver isso no JSON?
Porque quando é array, por número, tem o "["

json.png


Isso significa que x[ "bids" ] pode ter
x[ "bids" ][ 1 ]
x[ "bids" ][ 2 ]
etc.
E dá pra ver que cada um deles tem outro hash dentro
É uma lista NUMERADA, onde cada uma delas tem outra lista POR TEXTO.

É chatinho isso, mas acostuma.

Pegar segunda chave dentro de um JSON

MensagemEnviado: 18 Set 2020 13:27
por gilbertosilverio
Vlademiro, Quintas,

Obrigado pela ajuda...

Consegui entender como funciona o hash, desta maneira consegui fazer o que precisava.


FUNCTION JSON_GTPLAN()
     LOCAL hRet:=HB_Hash(), cRet:='', oELEMENTO, o, a02, A03
     cRET:=MEMOREAD( [C:\Users\gilbe\Desktop\GTPLAN.TXT] )
     hb_JsonDecode( cRet, @hRet )
    //hwg_msginfo(valtoprg(hRet))
   If Len(hRet) != 0
      If HB_HHasKey( hRet, 'bids' )
         For EACH oElemento IN hRet['bids']
             //HWG_MSGINFO(HB_ValToExp(oELEMENTO))
             A01 := oElemento["id_bid"]
             hwg_msginfo(a01)
             for each o in oElemento['items']
                 //HWG_MSGINFO(HB_ValToExp(o))
                 A02 := o['id_bid_item']
                 A03 := o['desc_item']
                 hwg_msginfo( ALLTRIM(a02)+[ ]+ALLTRIM(A03))
             next
         Next
      Else
         hwg_msginfo('ERRO: '+hb_UTF8ToStr(hRet['Msg']))
      Endif
   Else
      hwg_msginfo('ERRO: Erro no Envio da Chave')
   EndIf
RETURN(.T.)



Agradeço muito a ajuda...