leia um formato json de string
Moderador: Moderadores
leia um formato json de string
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
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

- Mensagens: 339
- Registrado em: 18 Jan 2009 10:39
- Localização: Ribeirao Pires - SP
leia um formato json de string
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
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
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
leia um formato json de string
É Harbour? Se for Harbour...Henry escreveu:// Alguém poderia apontar o que estou fazendo de errado
Começa por aqui:
Código: Selecionar todos
res := hb_JsonDecode( cJSNAllData )
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
leia um formato json de string
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
Código: Selecionar todos
{
"detalhe": [{
"tipo": "bom",
"moeda": "GTQ",
"[" (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/
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/
leia um formato json de string
agora eu coloco para adaptar suas contribuições.
muito agradecido
Henry Herrera
muito agradecido
Henry Herrera
leia um formato json de string
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
// 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
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
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
===============================================
|| 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
====================================================================
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"
}
]
}
|| 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"
}
]
}
