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

Pegar segunda chave dentro de um JSON

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

Moderador: Moderadores

 

Pegar segunda chave dentro de um JSON

Mensagempor gilbertosilverio » 18 Set 2020 10:15

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.
Anexos
T1.png
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 275
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 0 vez
Mens.Curtidas: 17 vezes

Pegar segunda chave dentro de um JSON

Mensagempor Vlademiro » 18 Set 2020 11:02

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 674
Data de registro: 11 Jul 2005 02:46
Curtiu: 14 vezes
Mens.Curtidas: 50 vezes

Pegar segunda chave dentro de um JSON

Mensagempor JoséQuintas » 18 Set 2020 13:02

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14697
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 865 vezes

Pegar segunda chave dentro de um JSON

Mensagempor gilbertosilverio » 18 Set 2020 13:27

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...
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 275
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 0 vez
Mens.Curtidas: 17 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Ahrefs [Bot], Google [Bot], Semrush [Bot] e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro