Pegar segunda chave dentro de um JSON

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Pegar segunda chave dentro de um JSON

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

Código: Selecionar todos

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.
Anexos
T1.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Pegar segunda chave dentro de um JSON

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pegar segunda chave dentro de um JSON

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Pegar segunda chave dentro de um JSON

Mensagem por gilbertosilverio »

Vlademiro, Quintas,

Obrigado pela ajuda...

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

Código: Selecionar todos


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...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Responder