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:
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:
"{" (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"
}
]
}