Página 1 de 1

leia um formato json de string

Enviado: 08 Dez 2020 05:26
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

leia um formato json de string

Enviado: 08 Dez 2020 13:38
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


leia um formato json de string

Enviado: 08 Dez 2020 14:03
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

leia um formato json de string

Enviado: 08 Dez 2020 14:27
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

leia um formato json de string

Enviado: 08 Dez 2020 15:26
por Henry
agora eu coloco para adaptar suas contribuições.
muito agradecido

Henry Herrera

leia um formato json de string

Enviado: 08 Dez 2020 15:41
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

leia um formato json de string

Enviado: 08 Dez 2020 16:06
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

leia um formato json de string

Enviado: 08 Dez 2020 16:39
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"
}
]
}