Ajuda pra chegar posicao num hash

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

Moderador: Moderadores

roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

Ajuda pra chegar posicao num hash

Mensagem por roberval »

Olá pessoal
to me batendo pra chegar numa posição do hash abaixo.. resultado de uma API

sei q é bem básico.. mas não to conseguindo chegar lá.. cheguei até o "ITEM", mas dai pra frente não consigo pegar nenhum campo.

Agradeço qquer ajuda. abraços

meu codigo

Código: Selecionar todos

aresultado := cret["resultados"]
aitem1      := aresultado['itens']
aitem2      := aitem1[1]
resultando em = { "item" => { "cd_cadastro" => "1376107", "cd_deposito" => "1", "cd_empresa" => "1", "cd_item" => "1101634", "dt_alteracao" => "30/12/1899 00:00:00", "id_b2bSaldo" => "1", "nr_registro" => "1", "qt_maxima" => "6", "qt_minima" => "5", "qt_saldo" => "100", "sit_estoque" => "DISPONIVEL","vl_preco" => "22,73", "vl_sugerido" => "0" } }


{"resultados":{"itens":[{"item":{"cd_empresa":"1","cd_cadastro":"1376107","cd_deposito":"1","cd_item":"1101634","qt_saldo":"100","qt_minima":"5","qt_maxima":"6","sit_estoque":"DISPONIVEL","dt_alteracao":"30\/12\/1899 00:00:00","vl_preco":"22,73","nr_registro":"1","vl_sugerido":"0","id_b2bSaldo":"1"}}]}}
Editado pela última vez por Jairo Maia em 14 Mar 2025 18:49, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda pra chegar posicao num hash

Mensagem por alxsts »

Olá!
roberval escreveu:to me batendo pra chegar numa posição do hash abaixo..
O código postado não é um Hash Harbour e sim uma string JSON:

Código: Selecionar todos

{
   "resultados":{
      "itens":[
         {
            "item":{
               "cd_empresa":"1",
               "cd_cadastro":"1376107",
               "cd_deposito":"1",
               "cd_item":"1101634",
               "qt_saldo":"100",
               "qt_minima":"5",
               "qt_maxima":"6",
               "sit_estoque":"DISPONIVEL",
               "dt_alteracao":"30\/12\/1899 00:00:00",
               "vl_preco":"22,73",
               "nr_registro":"1",
               "vl_sugerido":"0",
               "id_b2bSaldo":"1"
            }
         }
      ]
   }
}
Para transformar esta string JSON em um Hash Harbour, precisará utilizar a função hb_JsonDecode(), atribuindo o retorno da função a uma variável previamente declarada. Depois disto feito, use as funções Harbour para busca em Hashes.

Pesquise no fórum como usar.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Fico na dúvida se ele converteu ou não.
Depende aonde dá erro.

Tenho uma função pra ajudar nisso, depois de convertido pra hash.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Usando da forma nua e crua:

Código: Selecionar todos

   original := '{"resultados":{"itens":[{"item":{"cd_empresa":"1","cd_cadastro":"1376107","cd_deposito":"1","cd_item":"1101634","qt_saldo":"100","qt_minima":"5","qt_maxima":"6","sit_estoque":"DISPONIVEL","dt_alteracao":"30\/12\/1899 00:00:00","vl_preco":"22,73","nr_registro":"1","vl_sugerido":"0","id_b2bSaldo":"1"}}]}}'
   hData := hb_JsonDecode( original )
   ShowJson( hData, "hData" )
   Inkey(0)

Código: Selecionar todos

hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "cd_empresa" ] "1"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "cd_cadastro" ] "1376107"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "cd_deposito" ] "1"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "cd_item" ] "1101634"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "qt_saldo" ] "100"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "qt_minima" ] "5"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "qt_maxima" ] "6"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "sit_estoque" ] "DISPONIVEL"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "dt_alteracao" ] "30/12/1899 00:00:00"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "vl_preco" ] "22,73"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "nr_registro" ] "1"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "vl_sugerido" ] "0"
hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "id_b2bSaldo" ] "1"
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Isso levou a uma segunda versão que leva a uma terceira.
Aqui a segunda

Código: Selecionar todos

   original := '{"resultados":{"itens":[{"item":{"cd_empresa":"1","cd_cadastro":"1376107","cd_deposito":"1","cd_item":"1101634","qt_saldo":"100","qt_minima":"5","qt_maxima":"6","sit_estoque":"DISPONIVEL","dt_alteracao":"30\/12\/1899 00:00:00","vl_preco":"22,73","nr_registro":"1","vl_sugerido":"0","id_b2bSaldo":"1"}}]}}'
   hData := hb_JsonDecode( original )
   hResultado := hData[ "resultados" ]
   hItens := hResultado[ "itens" ]
   FOR EACH hItem IN hItens
      ShowJson( hItem, "hItem" )
   NEXT

   Inkey(0)

Código: Selecionar todos

hItem[ "item" ][ "cd_empresa" ] "1"
hItem[ "item" ][ "cd_cadastro" ] "1376107"
hItem[ "item" ][ "cd_deposito" ] "1"
hItem[ "item" ][ "cd_item" ] "1101634"
hItem[ "item" ][ "qt_saldo" ] "100"
hItem[ "item" ][ "qt_minima" ] "5"
hItem[ "item" ][ "qt_maxima" ] "6"
hItem[ "item" ][ "sit_estoque" ] "DISPONIVEL"
hItem[ "item" ][ "dt_alteracao" ] "30/12/1899 00:00:00"
hItem[ "item" ][ "vl_preco" ] "22,73"
hItem[ "item" ][ "nr_registro" ] "1"
hItem[ "item" ][ "vl_sugerido" ] "0"
hItem[ "item" ][ "id_b2bSaldo" ] "1"
Cada item tem elemento "item"
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Terceira versão separando [ "item" ]

Código: Selecionar todos

   original := '{"resultados":{"itens":[{"item":{"cd_empresa":"1","cd_cadastro":"1376107","cd_deposito":"1","cd_item":"1101634","qt_saldo":"100","qt_minima":"5","qt_maxima":"6","sit_estoque":"DISPONIVEL","dt_alteracao":"30\/12\/1899 00:00:00","vl_preco":"22,73","nr_registro":"1","vl_sugerido":"0","id_b2bSaldo":"1"}}]}}'
   hData := hb_JsonDecode( original )
   hResultado := hData[ "resultados" ]
   hItens := hResultado[ "itens" ]
   FOR EACH hItemData IN hItens
      hItem := hItemData[ "item" ]
      ShowJson( hItem, "hItem" )
   NEXT

   Inkey(0)

Código: Selecionar todos

hItem[ "cd_empresa" ] "1"
hItem[ "cd_cadastro" ] "1376107"
hItem[ "cd_deposito" ] "1"
hItem[ "cd_item" ] "1101634"
hItem[ "qt_saldo" ] "100"
hItem[ "qt_minima" ] "5"
hItem[ "qt_maxima" ] "6"
hItem[ "sit_estoque" ] "DISPONIVEL"
hItem[ "dt_alteracao" ] "30/12/1899 00:00:00"
hItem[ "vl_preco" ] "22,73"
hItem[ "nr_registro" ] "1"
hItem[ "vl_sugerido" ] "0"
hItem[ "id_b2bSaldo" ] "1"
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda pra chegar posicao num hash

Mensagem por alxsts »

Olá!
JoséQuintas escreveu:Cada item tem elemento "item"
Não é assim que eu vejo... talvez o que a tua função imprime leve a pensar assim.

- "Resultado" é o hash principal.
--- Dentro dele tem outro hash "Itens", que é uma coleção de "Item".
------ Dentro de cada "Item" tem os campos individuais de cada item. Nestes campos não tem nenhum outro "Item"... isto fica claro no JSON formatado, postado acima.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Também fiquei na dúvida.
A última rotina comprovou.

senão daria erro aqui:

Código: Selecionar todos

 FOR EACH hItemData IN hItens
   hItem := hItemData[ "item" ]
aqui mostrou certo

Código: Selecionar todos

hData[ "resultados" ][ "itens" ][ 1 ][ "item" ][ "qt_minima" ] "5"
itens tem os elementos de array, e cada elemento tá dentro de um [ "item" ]
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

erro.png
Xiiii... não aceita o fonte completo.
E também tá aparecendo o que mostrei no batepapo.
Será que é implementação pra bots ?
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Fonte completo do último teste, com a função ShowJson()
test.prg
(1.71 KiB) Baixado 82 vezes
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

roberval escreveu:sei q é bem básico.. mas não to conseguindo chegar lá.. cheguei até o "ITEM", mas dai pra frente não consigo pegar nenhum campo.
Tava revendo.
Ele converteu sim, justamente o problema foi quando chegou no item.
E acho que era justamente isso de "item" que atrapalhou.

Pois é...
Essa ShowJson() é muito útil, e nem é coisa do outro mundo.
Apenas mostra o conteúdo conforme o tipo de variável.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Passo a passo, nem é tão complicada assim:

Código: Selecionar todos

   IF ValType( xHash ) $ "NCDL" .OR. xHash == NIL
      cTxt += cTxtVariavel + " " + hb_ValToExp( xHash ) + hb_Eol()
acima, se um tipo normal de variável, mostra o conteúdo hb_ValToExp()

Código: Selecionar todos

   ELSEIF ValType( xHash ) == "A"
      FOR EACH xItem IN xHash
         ShowJson( xItem, cTxtVariavel + "[ " + Ltrim( Str( xItem:__EnumIndex ) ) + " ]", @cTxt, .F. )
      NEXT
acima, variável array, então usa-se FOR/NEXT ou FOR/EACH, o __EnumIndex é o conteúdo do "contador" de 1 até o que der

Código: Selecionar todos

   ELSEIF ValType( xHash ) == "H"
      FOR EACH xItem IN xHash
         ShowJson( xItem, cTxtVariavel + '[ "' + hb_hKeyAt( xHash, xItem:__EnumIndex ) + '" ]', @cTxt, .F. )
      NEXT
acima, variável hash, FOR/EACH resolve, o hb_hKeyAt() deu o texto do elemento

É tudo meio elementar.
Junta a isso recursividade, variáveis precisam ser bem declaradas, passar por referência ou não, e só.
Com isso a rotina vai repetindo tudo do nível mais alto até o nível de detalhe.
E pode ser usada pra qualquer parte, quase gerando um fonte pronto pra uso.

Não faz parte do meu dia a dia o hb_hKeyAt(), o resto é meio comum.

Não nasceu assim, fui ajustando conforme o que acontecia.
A última foi gerar o txt, porque arquivo grande ficava ruim de visualizar com poucas linhas.
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/
roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

Ajuda pra chegar posicao num hash

Mensagem por roberval »

Olá pessoal. obrigado pela ajuda
vendo o codigo do José Quintas, abriu a mente
abaixo o codigo da solução

Código: Selecionar todos

oHttp := tipclienthttp():new('http://drop.laquila.com.br:8189/api_acom/acom/TTerceiros/Integracao/xxxxxxxxxxxxxxxxxxxxxx/00006',.T.)

VDATA:={ "filtro"=> {"token"=> "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",;
         "cnpj_empresa" => "xxxxxxxxxxxxxxxxxxxxxx",;
         "itensporpagina"=> "100",;
         "pagina"=> "1",;
         "cd_item"=> PCOD_FABRICA }}

if ohttp:open()
   if ohttp:post(hb_jsonencode(vData))
      cRet := ohttp:readall()
   endif
endif
ohttp:close()
if !empty(cRet)
   nRet :=hb_jsondecode(cRet,@cRet)
endif
IF cret!=NIL .AND. !EMPTY(CRET)
      aresultado   := cret["resultados"]
      aitem1       := aresultado['itens']
      aitem2       := aitem1[1]
      aitem3       := aitem2['item']
       VSALDO       := aitem2['item','qt_saldo']
       vsit_estoque := aitem2['item','sit_estoque']
endif
return vsaldo
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda pra chegar posicao num hash

Mensagem por JoséQuintas »

Legal, mas tem algo estranho, compilação -w3 -es2 teria avisado.

Criou aitem3, o que facilitaria, mas não usou.
Poderia ser assim

Código: Selecionar todos

IF cret!=NIL .AND. !EMPTY(CRET)
      hresultado   := cret["resultados"]
      hItemList := aresultado['itens'] // antigo aitem1
      hUmItem := hItemList[1] // antigo aitem2
      hDetItem := hUmItem['item'] // antigo aitem3
       VSALDO       := hDetItem['qt_saldo']
       vsit_estoque := hDetItem['sit_estoque']
endif
Acho que com estes nomes facilita olhar o fonte no futuro
hItemList -> lista de itens
hUmItem -> Um item individual
hDetItem -> Detalhes do item

Não pense apenas em resolver esta situação, imagine que no futuro pode precisar processar mais de um item.
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/
roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

Ajuda pra chegar posicao num hash

Mensagem por roberval »

Oi José..
sim, normalmente eu uso nomes de variáveis melhores, identificando.
usei dessa forma pra testes
muito obrigado
Responder