leia um formato json de string

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

Moderador: Moderadores

Henry
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 08 Dez 2020 04:57
Localização: Guatemala

leia um formato json de string

Mensagem por Henry »

Olá a todos
Eu postei anteriormente, mas acho que não foi gravado.
Eu tenho uma string formatada em JSON como esta

{
"detalhe": [{
"tipo": "bom",
"moeda": "GTQ",
"data de transmissão": "2020-12-07",
"descrição": "Parafusos 1/2, rosca americana",
"quantidade": "10,00",
"unitMedida": "UNI",
"desconto": "0,00",
"preço unitário": "0,75"
},

{
"tipo": "bom",
"moeda": "GTQ",
"data de transmissão": "2020-12-07",
"descrição": "Parafusos de 1 pol., rosca americana",
"quantidade": "10,00",
"unitMedida": "UNI",
"desconto": "0,00",
"preço unitário": "1,10"
}
]
}

o que eu preciso fazer é convertê-lo e passá-lo para um array
meu código é o seguinte:

cJSNAllData:= ' { "detalhe": [{ "tipo": "bom", "moeda": "GTQ", "transmiss": "2020-12-07", "descri": "Parafusos 1/2, rosca americana", "quantidade": "10,00", "unitMedida": "UNI", "desconto": "0,00",
"unitario": "0,75" }, { "tipo": "bom", "moeda": "GTQ", "transmiss": "2020-12-07", "descri": "Parafusos de 1 pol., rosca americana", "quantidade": "10,00", "unitMedida": "UNI", "desconto": "0,00",
"unitario": "1,10" } ] } '

res:={=>}
nLength:= hb_jsondecode(cJSNAllData, @res )

// mas recebo um erro na linha de loop:
// Error BASE/1132 Error de rango: acceso al array Args: [1] = H => [2] = C "detalhe"

// Alguém poderia apontar o que estou fazendo de errado

FOR EACH o IN res["detalhe"]
if "descri" $ o
?? o["descri"]
endif
NEXT
RETURN


Agradeço a ajuda que você pode me fornecer.
Henry Herrera
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

leia um formato json de string

Mensagem por gilbertosilverio »

Ola,

Não e meu forte hash, meu conhecimento e limitado, mais tenta fazer algo baseado neste exemplo:

Creio que voce precisa usar o HB_HHasKey...

O Valtoprg() vai te mostrar o json inteiro

O ValtoExp() vai te mostrar todas as chaves do json, e por ai voce filtra o que precisa

Código: Selecionar todos

   hb_JsonDecode( cRet, @hRet )                         

//hwg_msginfo(valtoprg(hRet))  - visualizar o todo o arquivo txt

   If Len(hRet) != 0                                     

      //HWG_MSGINFO(HB_ValToExp(oELEMENTO)) - visualiza o elemento da hash

      If HB_HHasKey( hRet, 'bids' )
         For EACH oElemento IN hRet['bids']              // matriz := {  bids, items, parc, mfrs }
             A01 := oElemento['id_bid']
             A02 := oElemento['title']
             A03 := oElemento['date_start_bid']
             A04 := oElemento['date_end_bid']
             A05 := oElemento['client_name']
             A06 := oElemento['client_reg']
             A07 := oElemento['contact']
             A08 := oElemento['id_payment_cond']
             A10 := oElemento['desc_payment_cond']
             A11 := oElemento['obs']
             for each o in oElemento['items']
                 A12 := o['id_bid_item']
                 A13 := o['cod_item']
                 A14 := o['desc_item']
                 A15 := o['qty_item']
                 A16 := o['cod_std_unit']
                 A17 := o['desc_std_unit']
                 for each a in o['mfrs']
                     A22 := a['desc_mfr']
                 next
                 aadd( Mata, { A01, A12, A13, A14, A15, A16, A17, A22 } )
             next
             IF LEN(MATA) > 0
                CLOSE DATA
                bARQCLI   := [C:\DISTRI\xCLIENTE.DBF]
                IF FILE(bARQCLI)
                   bARQCLI   := [C:\DISTRI\xCLIENTE.DBF]
                   bARQCLIIN := [C:\DISTRI\xRCLICGC.NTX]
                ENDIF
                SELECT(1)
                USE (bARQCLI) NEW SHARED ALIAS xCLIENTE
                SET INDEX TO &bARQCLIIN
                xCODVE:=0 ; xUF:=[**] ; xCODCLI:=0 ; xRAZAO:=[*]
                a_CNPJ:=TRANSF(STRZERO(VAL(A06)),[@R 99.999.999/9999-99])
                xCLIENTE->(DBSEEK( a_CNPJ ), .F.)   // volta aqui
                IF xCLIENTE->(FOUND())
                   xCODVE:=STR(REPRE,5) ; xUF:=ESTA ; xCODCLI:=COD ; xRAZAO:=RAZAO
                ENDIF
                CLOSE DATA
             ENDIF
             SALVAR_SQL_GTPLAN()
             MATA:={}
         Next
      Else
         hwg_msginfo('ERRO: '+hb_UTF8ToStr(hRet['Msg']))
      Endif
   Else
      hwg_msginfo('ERRO: Erro no Envio da Chave')
   EndIf

GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.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

leia um formato json de string

Mensagem por JoséQuintas »

Henry escreveu:// Alguém poderia apontar o que estou fazendo de errado
É Harbour? Se for Harbour...
Começa por aqui:

Código: Selecionar todos

res := hb_JsonDecode( cJSNAllData )
o resultado é um array multidimensional, que pode conter uma mistura de hash e array.
Pesquisa no fórum que cheguei a postar um fonte pra mostrar o conteúdo de um hash.

Tenho a impressão de que o array principal é hash e tem res[ "detalhe" ]
Que é um array, que contém hash.

res[ "detalhe" ][ 1 ][ "tipo" ]

Confirme......

Código: Selecionar todos

res := hb_JsonDecode( cJSNAllData )
FOR EACH aItem IN res[ "detalhe" ]
   ? aItem[ "tipo" ]
   ? aItem[ "moeda" ]
...
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

leia um formato json de string

Mensagem por JoséQuintas »

Só chamar atenção:

Código: Selecionar todos

{
"detalhe": [{
"tipo": "bom",
"moeda": "GTQ",
"{" (Chave) indica elementos HASH
"[" (colchete) indica elementos array

Passo a passo:

{ => começa um hash
"detalhe": => esse é o hash variavel[ "detalhe" ]

[ == começa um array

variavel[ "detalhe" ] [ 1 ] // produto 1

{ == começa um hash

variavel( "detalhe" ][ 1 ][ "tipo" ] := "bom" // dados do produto 1
variavel[ "detalhe" ][ 1 ][ "moeda" ] := "GTQ" // dados do produto 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/
Henry
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 08 Dez 2020 04:57
Localização: Guatemala

leia um formato json de string

Mensagem por Henry »

agora eu coloco para adaptar suas contribuições.
muito agradecido

Henry Herrera
Henry
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 08 Dez 2020 04:57
Localização: Guatemala

leia um formato json de string

Mensagem por Henry »

Se eu estiver usando o Harbor Minigui Extended + Borland

// esta parte do código, isso me marca um erro: res := hb_JsonDecode( cJSNAllData )

res := hb_JsonDecode( cJSNAllData )
FOR EACH aItem IN res[ "detalle" ]
? aItem[ "descripcion" ]
? aItem[ "precioUnitario" ]
NEXT


Date: 2020-12-08 Time: 12:31:14
Application: C:\REST-FEGORA\ApiRest-Client.EXE
Time from start: 0 days 0 hours 0 mins 16 secs
Error BASE/1132 Error de rango: acceso al array Args: [1] = H => [2] = C detalle
Henry
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 08 Dez 2020 04:57
Localização: Guatemala

leia um formato json de string

Mensagem por Henry »

gilbertosilverio
Muito obrigado por responder:


Tentei adaptar o código com base no que você postou:


hRet:={}
nLen:= hb_JsonDecode(cJSNAllData, @hRet )
msginfo( valtoprg(cJSNAllData) ) // - visualizar o todo o arquivo txt
If Len(hRet) != 0

// quando atinge a linha da condição IF: if HB_HHasKey( hRet, 'detalle' ), pula para a linha ELSE msginfo('ERRO: '+hb_UTF8ToStr(hRet['Msg']))

If HB_HHasKey( hRet, 'detalle' )
For EACH oElemento IN hRet['detalle']
....
...
Else
msginfo('ERRO: '+hb_UTF8ToStr(hRet['Msg']))
Endif
Henry
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 08 Dez 2020 04:57
Localização: Guatemala

leia um formato json de string

Mensagem por Henry »

===============================================
|| RESOLVIDO ||
===============================================

Remontei a linha JSON e fiz uma adaptação de acordo com seus códigos.

e agora funciona, ainda não entendi o que não funcionava com o código anterior.

mas agradeço sua ajuda, agora tenho um pouco mais de conhecimento e critérios para lidar com JSON


========================================
esclarecimento
=======================================
pois é um código de vários exemplos,
variáveis ​​podem não ter um nome de acordo com sua função, mas funciona.

Deixo o código funcional, caso alguém precise

Código: Selecionar todos

res:={}
o=0
cJSNAllData:= ' {"detalle": [{ "tipo": "bien", "moneda": "GTQ", "fechaEmision": "2020-12-07", "descripcion": "Tornillos 1/2, Rosca Americana", "cantidad": "10.00", "unidadMedida": "UNI", "descuento": "0.00", "precioUnitario": "0.75" }, '+;
' { "tipo": "bien", "moneda": "GTQ", "fechaEmision": "2020-12-07", "descripcion": "Tornillos 1 plg, Rosca Americana", "cantidad": "10.00", "unidadMedida": "UNI", "descuento": "0.00", "precioUnitario": "1.10" }]} '

nLen := hb_jsondecode(cJSNAllData, @res )
paises:=res["detalle"]
aPaises:= {}
If HB_HHasKey( res, "detalle" )
  FOR EACH o IN paises
    cname:=""
    ciso2:=""
    ciso3:=""
    if "descripcion" $ o
      ciso2 :=o["descripcion"]
    endif
    if "precioUnitario" $ o
      cname :=o["precioUnitario"]
    endif
    AADD(aPaises,{cname,ciso2})
  NEXT
endif
RETURN(apaises) 
====================================================================
format JSON Pretty code
====================================================================
{
"detalle": [{
"tipo": "bien",
"moneda": "GTQ",
"fechaEmision": "2020-12-07",
"descripcion": "Tornillos 1/2, Rosca Americana",
"cantidad": "10.00",
"unidadMedida": "UNI",
"descuento": "0.00",
"precioUnitario": "0.75"
},
{
"tipo": "bien",
"moneda": "GTQ",
"fechaEmision": "2020-12-07",
"descripcion": "Tornillos 1 plg, Rosca Americana",
"cantidad": "10.00",
"unidadMedida": "UNI",
"descuento": "0.00",
"precioUnitario": "1.10"
}
]
}
Responder