Página 1 de 1

Como simplificar criação de hash/json?

Enviado: 21 Jul 2023 10:57
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 ?

Como simplificar criação de hash/json?

Enviado: 02 Ago 2023 12:03
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)

Como simplificar criação de hash/json?

Enviado: 04 Ago 2023 09:43
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.

Como simplificar criação de hash/json?

Enviado: 04 Ago 2023 10:51
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.

Como simplificar criação de hash/json?

Enviado: 28 Set 2023 12:07
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

Como simplificar criação de hash/json?

Enviado: 28 Set 2023 16:55
por vagucs
Poxa, legal, essa nao tinha visto. valeu!