Como simplificar criação de hash/json?

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como simplificar criação de hash/json?

Mensagem por JoséQuintas »

Código: Selecionar todos

METHOD QrCodeVencto() CLASS itauclass

   LOCAL cUrl, hMsg := hb_Hash(), hVencto := hb_Hash(), hDevedor := hb_Hash(), hValor := hb_Hash()

   hVencto[ "dataDeVencimento" ] := Date() + 30
   hDevedor[ "cpf" ] := "1234"
   hDevedor[ "nome" ] := "nome"
   hValor[ "original" ] := "123.45"
   cUrl := "/cobv/{txid}"
   hMsg[ "calendario" ] := hVencto
   hMsg[ "devedor" ] := hDevedor
   hMsg[ "valor" ] := hValor
   hMsg[ "chave" ] := "xxxx"
Estou achando muito fonte pra pouca coisa.
Como simplificar a criação desse 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
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Como simplificar criação de hash/json?

Mensagem por vagucs »

Olá quintas,

A forma em qualquer linguagem seria isso mesmo.

Informações importantes:

Essa forma também cria um hash vazio.

local xVar = {=>}

Essa rotina transforma todo um json que está em string para a variável pre-declarada.

hb_jsondecode(cStringJSon,@xVar)

Existem funções especificas que você pode configurar o hash em Harbour.

hb_HBinary( xJson, .t. ) -> Trata os indices do Json como binários, ajuda no caso de ter algo em UTF-8
hb_HCaseMatch( xJson, .f. ) -> Faz com que o jSon fique insensitivo ao caso (Maiúscula ou minúsculo)
hb_HSetAautoAdd(xJson,.f.) -> Faz com que, ao especificar um elemento que não exista no json, ele seja adicionado, caso contrário um erro de acesso irá ocorrer.

A unica coisa que acho péssimo, é ter que ficar pesquisando antes de cada acesso, se uma chave existe, isso tinha que mudar, no caso de não existir a chave, mas é algo fácil de contornar.

cHash = iif(hb_hhaskey(xJson,'partner'),xJson['partner'],'') -> Sempre uso assim, ao ler um valor de um jSon, assim, se a chave nao existir, tenho um valor default.

Por final a HB_JSONENCODE para tornar o jSon uma string novamente:

xStrJson = HB_JSONENCODE(xJson)
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Como simplificar criação de hash/json?

Mensagem por clodoaldomonteiro »

Grande Quintas.

Mês passado estava usando Hash e fiz assim:

Código: Selecionar todos

   Private hIrMemo := Hash(;     //Memória de C lculo IRRF
    'BaseVerbasIncidentesVinculoPrincipal', 0.00,;
    'BaseVerbasIncidentesVinculoOutros', 0.00,;
    'BaseVerbasDeducoes'     , 0.00,;
    'ValorDescPrevidencia'    , 0.00,;
    'ValorDescPrevidenciaOutros', 0.00,;
    'DependenteIRQuantidade'  , 0,;
    'DependenteIRValorBase'   , 0.00,;
    'DeducaoInativo65Anos'    , 0.00,;
    'BaseCalculoIrrfNormal'   , 0.00,;
    'ValorDeduzirIRSimplificado' , 0.00,;
    'BaseCalculoIrrfSimplificado', 0.00,;
    'ValorAliquotaIRRF'    , 0.00,;
    'ValorDeducaoIRRF'     , 0.00,;
    'ValorIRRFPago'        , 0.00,;
    'ValorIRRFLancado'     , 0.00;
    )

   HSet( hIrMemo, 'BaseVerbasIncidentesVinculoPrincipal' , MVANT )
   HSet( hIrMemo, 'BaseVerbasIncidentesVinculoOutros'    , mVant2 )
   HSet( hIrMemo, 'ValorVerbasDeducoes'         , MDESC + mDesc3 )
   HSet( hIrMemo, 'ValorDescPrevidencia'        , nValorInss )
   HSet( hIrMemo, 'ValorDescPrevidenciaOutros'  , mInss2 )
   HSet( hIrMemo, 'DependenteIRQuantidade'      , nQtdDepIR )
   HSet( hIrMemo, 'DependenteIRValorBase'       , M->irDedDepen )
   HSet( hIrMemo, 'DeducaoInativo65Anos'        , mDeduz65 )
   HSet( hIrMemo, 'BaseCalculoIrrfNormal'       , mRetorno )
   HSet( hIrMemo, 'ValorDeduzirIRSimplificado'  , M->irDedSimpl )
   HSet( hIrMemo, 'BaseCalculoIrrfSimplificado' , mRetorno2 )

HSet() is the functional equivalent of the hash access operator [ ] in conjunction with the inline assignment operator :=. It provides the same functionality for populating a hash or changing the value of existing key/value pais, but is slightly less efficient.
Outro exemplo (do manual):

Código: Selecionar todos

// The example demonstrates two posibilities of populating a hash
// and changing its values.

   PROCEDURE Main
      LOCAL hHash := {=>}

      hHash[ "A" ] := 10
      HSet( hHash, "B", 20 )

      ? ValToPrg( hHash )
      // result: { "A" => 10, "B" => 20 }

      hHash[ "B" ] := 100
      HSet( hHash, "A", 200 )

      ? ValToPrg( hHash )
      // result: { "A" => 200, "B" => 100 }
   RETURN
Abraços.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como simplificar criação de hash/json?

Mensagem por JoséQuintas »

Era sobre isso mesmo.
Vi depois essa função na biblioteca de compatibilidade XHarbour, mas evito ao máximo essa LIB, porque ela afeta outras coisas.
Acabei criando equivalente, foi só usar FOR/NEXT.
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
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Como simplificar criação de hash/json?

Mensagem por NiltonGM »

vagucs escreveu:mudar, no caso de não existir a chave, ma
Vagucs, existe funções para obter uma chave do hash e se não existir retorna o default que você especificar:

Código: Selecionar todos

    local h := { "key1" => "chave 1", "key2" => "chave 2"}

    ? hb_HGetDef(h, "key1", "chave defaut")      // Retorna "chave 1"
    ? hb_HGetDef(h, "key5", "chave 5")              // Retorna "chave 5"
Também existe a função hb_HGetRef() para verificar se a chave existe:

Código: Selecionar todos

    if hb_HGetRef(h, "key5")
       ? h["key5"]
    else
       ? "chave 5 não existe"
    endif
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Como simplificar criação de hash/json?

Mensagem por vagucs »

Poxa, legal, essa nao tinha visto. valeu!
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder