Página 1 de 1

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 16:59
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"}}]}}

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 19:01
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.

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 19:22
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.

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 19:28
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"

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 19:34
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"

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 19:36
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"

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:02
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.

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:10
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" ]

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:19
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 ?

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:21
por JoséQuintas
Fonte completo do último teste, com a função ShowJson()
test.prg
(1.71 KiB) Baixado 82 vezes

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:27
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.

Ajuda pra chegar posicao num hash

Enviado: 14 Mar 2025 20:44
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.

Ajuda pra chegar posicao num hash

Enviado: 15 Mar 2025 16:23
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

Ajuda pra chegar posicao num hash

Enviado: 15 Mar 2025 18:42
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.

Ajuda pra chegar posicao num hash

Enviado: 16 Mar 2025 08:38
por roberval
Oi José..
sim, normalmente eu uso nomes de variáveis melhores, identificando.
usei dessa forma pra testes
muito obrigado