função HScan() para hash table

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

Moderador: Moderadores

cMach
Usuário Nível 1
Usuário Nível 1
Mensagens: 23
Registrado em: 21 Out 2019 08:18
Localização: rio de janeiro

função HScan() para hash table

Mensagem por cMach »

Olá Pessoal,
Estou tentando localizar um valor em um json usando a função hScan mas não retorna positivo, mesmo quando o valor existe no arquivo. Alguém tem alguma dica?
Ex:

Código: Selecionar todos

local obj     
local htable := hash()
...
hb_jsonDecode(obj:ResponseBody, @htable)

if ( HScan( htable, "[b]Lote processado com sucesso[/b]."))
   ? "Registro localizado"
endif   

...
json:

Código: Selecionar todos

{
    "message": "Evento retornado",
    "data": {
        "ocorrencias": [],
        "eventos": [
            {
                "evtTest": {
                    "ideEvento": {
                    },
                    "ideEvento2": {
                    },
                            }
                        }
                },
                "status": {
                    "codigo": "xxx",
                    "mensagem": "evento inválido."
                },
        "status_consulta": {
            "mensagem": "[b]Lote processado com sucesso[/b]."
        },
        ]
    }
}
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

função HScan() para hash table

Mensagem por Vlademiro »

O Json está mal formado.

Fiz um teste usando o harbour 3.4 e ele não conseguiu ler o Json

Código: Selecionar todos


#xtranslate text into <v> [<rst:reset>]   => #pragma __text|<v>+=%s;if(<.rst.>,<v>:="",)

PROCEDURE Main

    local cJson, hTable

    TEXT INTO cJson RESET
{
    "message": "Evento retornado",
    "data": {
        "ocorrencias": [],
        "eventos": [
            {
                "evtTest": {
                    "ideEvento": {
                    },
                    "ideEvento2": {
                    },
                            }
                        }
                },
                "status": {
                    "codigo": "xxx",
                    "mensagem": "evento inválido."
                },
        "status_consulta": {
            "mensagem": "[b]Lote processado com sucesso[/b]."
        },
        ]
    }
}


    ENDTEXT
    ? cJson

    htable := hb_jsonDecode( cjson )

    ? hb_ValToExp( hTable )
    ? HScan( hTable , "[b]Lote processado com sucesso[/b]." )  // HSCan retorna um numero


    RETURN
Outra coisa. No Harbour 3.4 (com a lib xhb.hbc) o retorno de HScan é um número, não um valor lógico

Dica: testa o Json em https://jsonformatter.org/json-parser
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

função HScan() para hash table

Mensagem por bencz »

HUmm... isso não me faz muito sentido... SE realmente o sistema consegue decodificar o Json e inserir dentro de um HASH Table, provavelmente ele vai ter apenas as chaves, não ?
Pois uma estrutura HASH não consegue possuir valores duplicados...

Veja este exemplo: viewtopic.php?f=46&t=18781#p119665
Imagem
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

função HScan() para hash table

Mensagem por asimoes »

Exemplo de uso:

Código: Selecionar todos

nRec      := Hb_HScan( ::hConcessionarias, {| nKey, cChave | cChave["CODEFEBRABAN"] = oElemento["CODCON"] } )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

função HScan() para hash table

Mensagem por JoséQuintas »

Ainda não entendo nada disso, mas....
Se json vira array....

Código: Selecionar todos

IF aVar[ "data" ] [ "status_consulta" ] [ "mensagem" ] == "[b]Lote processado com sucesso[/b]"
   ? "sei lá se tá certo"
ENDIF
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

função HScan() para hash table

Mensagem por JoséQuintas »

É.... exatamente o que eu pensava....

Código: Selecionar todos

{
    "glossary": {
        "title": "example glossary",
		"GlossDiv": {
            "title": "S",
			"GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
					"SortAs": "SGML",
					"GlossTerm": "Standard Generalized Markup Language",
					"Acronym": "SGML",
					"Abbrev": "ISO 8879:1986",
					"GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
						"GlossSeeAlso": ["GML", "XML"]
                    },
					"GlossSee": "markup"
                }
            }
        }
    }
}

Código: Selecionar todos

PROCEDURE Main

   LOCAL hTable := hb_Hash()

   SetMode( 25, 80 )
   CLS
   hb_JsonDecode( MemoRead( "test.txt" ), @hTable )
   ? Len( hTable )
   ? hTable[ "glossary" ] [ "title" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "title" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "ID" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "SortAs" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossTerm" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "Acronym" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "Abbrev" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossDef" ] [ "para" ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossDef" ] [ "GlossSeeAlso" ] [ 1 ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossDef" ] [ "GlossSeeAlso" ] [ 2 ]
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossSee" ]
   Inkey(0)

   RETURN
json.png
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

função HScan() para hash table

Mensagem por JoséQuintas »

Pequena descrição:

Variável HASH é igual variável array, com a diferença de que ao invés de número, se usa um texto.

a[ 1 ], a[ 2 ], a[ 3 ] vira a[ "primeiro" ], a[ "segundo" ], a[ "terceiro" ]

E.... array pode ser multidimensional, seja hash ou não.

O formato json nada mais é do que o array (hash) representado em forma de texto.

chaves {} representam divisão em arrays identificados por nome (hash)
colchetes [] representam divisão em arrays identificados por número
"nome": representa o nome que identifica o elemento do array

Não gostei.
Pode economizar bytes pro computador, mas confunde.
XML é mais interessante.
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/
cMach
Usuário Nível 1
Usuário Nível 1
Mensagens: 23
Registrado em: 21 Out 2019 08:18
Localização: rio de janeiro

função HScan() para hash table

Mensagem por cMach »

Concordo, é meio trabalhoso.
Existe uma serie de funções no harbour para facilitar a manipulação da hash table, a exemplo do "HHasKey" que verifica se uma determinada chave existe ou não no array, mas de qq forma precisa informar o endereço dela. O HScan, que ainda não me foi util por não ter conseguido usar adequadamente, mas pelo que entendo dele, deveria procurar por um valor informado, sem a necessidade de colocar o endereço do array. Ou seja, preciso saber se no json tem um campo chamado "protocolo" mas não sei onde ele pode estar. Neste caso, acho que o HScan seria util.
Obg
cMach
Usuário Nível 1
Usuário Nível 1
Mensagens: 23
Registrado em: 21 Out 2019 08:18
Localização: rio de janeiro

função HScan() para hash table

Mensagem por cMach »

Qualquer informação que eu procure usando o Hscan retorna 0, mesmo que a informações esteja no json...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

função HScan() para hash table

Mensagem por JoséQuintas »

cMach escreveu:Qualquer informação que eu procure usando o Hscan retorna 0, mesmo que a informações esteja no json...
Se HSCan é o equivalente de AScan.... então não vai procurar em sub-arrays, somente no array principal.
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/
cMach
Usuário Nível 1
Usuário Nível 1
Mensagens: 23
Registrado em: 21 Out 2019 08:18
Localização: rio de janeiro

função HScan() para hash table

Mensagem por cMach »

Faz sentido José Quintas... infelizmente sendo assim não adiantaria muito.
obg pela atenção.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

função HScan() para hash table

Mensagem por JoséQuintas »

JoséQuintas escreveu:Se HSCan é o equivalente de AScan.... então não vai procurar em sub-arrays, somente no array principal.
Na prática é pior que isso. HSCAN realmente é igual a ASCAN, mas isso procura nos valores e não nos IDs....

Não sei se tem outro jeito, mas assim foi:

Código: Selecionar todos

PROCEDURE Main

   LOCAL hTable := hb_Hash()

   SetMode( 25, 80 )
   CLS
   hb_JsonDecode( MemoRead( "test.txt" ), @hTable )
   ? hTable[ "glossary" ] [ "GlossDiv" ] [ "GlossList" ] [ "GlossEntry" ] [ "GlossDef" ] [ "para" ]
   ? PesquisaHash( hTable, "para" )

   Inkey(0)

   RETURN

STATIC FUNCTION PesquisaHash( hTable, cTexto )

   LOCAL oElement, xValue := ""

   IF hb_HHasKey( hTable, cTexto )
      RETURN hTable[ cTexto ]
   ENDIF
   FOR EACH oElement IN hTable
      IF ValType( oElement ) == "H"
         xValue := PesquisaHash( oElement, cTexto )
         IF ! Empty( xValue )
            EXIT
         ENDIF
      ENDIF
   NEXT

   RETURN xValue
hash.png
Pensei como array:
Pesquisa no atual, se não tem, vê nos subelementos que forem hash, e assim por diante até encontrar.
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

função HScan() para hash table

Mensagem por asimoes »

No meu teste hb_HScan funciona, o teste abaixo retorna 2

Código: Selecionar todos

  hTable  := {=>}
   
   hRecord := {=>}
   hRecord["CODIGO"] := "001"
   Hb_HSet(hTable, "1", hRecord)
   
   hRecord := {=>}
   hRecord["CODIGO"] := "002"
   Hb_HSet(hTable, "2", hRecord)
   
   hRecord := {=>}
   hRecord["CODIGO"] := "003"
   Hb_HSet(hTable, "3", hRecord)
   
   cJSON := Hb_JSONEncode( hTable, .T.)
   
   nPos := hb_HScan( hTable, {| nKey, cChave | cChave["CODIGO"] = "002"} )
   
   Hb_MemoWrit( "JSON.JSON", cJSON )
 
   cJSON := MemoRead( "JSON.JSON" ) //Leitura do JSON
   
   nLen := hb_jsonDecode( cJSON, @hTable )
   
   nPos := hb_HScan( hTable, {| nKey, cChave | cChave["CODIGO"] = "002"} )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

função HScan() para hash table

Mensagem por asimoes »

Mais registros

Código: Selecionar todos

  hTable  := {=>}
   
   FOR nInt := 1 TO 100
      hRecord := {=>}
      hRecord["CODIGO"] := StrZero(nInt,3)
      Hb_HSet(hTable, Hb_NtoS(nInt), hRecord)
   NEXT
   
   cJSON := Hb_JSONEncode( hTable, .T.)
   
   nPos := hb_HScan( hTable, {| nKey, cChave | cChave["CODIGO"] = "015"} )
   
   Hb_MemoWrit( "JSON.JSON", cJSON )

   cJSON := MemoRead( "JSON.JSON" ) //Leitura do JSON
   
   hTable := Nil
   
   nLen := hb_jsonDecode( cJSON, @hTable )
   
   nPos := hb_HScan( hTable, {| nKey, cChave | cChave["CODIGO"] = "030"} )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

função HScan() para hash table

Mensagem por asimoes »

Mostra o JSON para testar, deve ser bobeira
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder