Página 1 de 2
Harbour JSON, JavaScript Object Notation
Enviado: 09 Set 2010 13:46
por Itamar M. Lins Jr.
Ola forum.
2010-09-08 18:15 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
+ harbour/src/rtl/hbjson.c
+ added JavaScript Object Notation (JSON) encoder, decoder functions
; C level functions:
char * hb_jsonEncode( PHB_ITEM pValue, HB_SIZE * pnLen );
pValue - value to encode;
pnLen - if pnLen is not NULL, length of returned buffer is
stored to *pnLen;
returns pointer to encoded JSON buffer. buffer must be fried
by the caller.
HB_SIZE hb_jsonDecode( const char * szSource, PHB_ITEM pValue );
szSource - JSON source;
pValue - item to store decoded value. Item value is
undetermined in case of error;
returns number of bytes decoded from the buffer. This allows
to use the remaining part of the buffer for some other
purposes. Returns 0 on error.
Harbour level functions:
hb_jsonDecode( cJSON, @xValue ) --> nLengthDecoded
hb_jsonEncode( xValue ) --> cJSON
Note:
- Harbour types unsupported by JSON (date, timestamp, etc.) are
encoded as null values;
- strings are encoded in UTF-8;
- JSON encode functions are safe for recursive arrays and hashes.
Recursive part of array or hash will be stored as null. JSON
encoder still allows to use same structure in the leaves, in
this case content will be duplicate.
I.e.:
xI := {1, NIL}
xI[2] := xI
? hb_jsonEncode( xI ) // [1,null]
but:
xI := {1, .T.}
xI := {2, xI, xI}
? hb_jsonEncode( xI ) // [2,[1,true],[1,true]]
Examplo de uso:
Código: Selecionar todos
I just created this sample to test the new functions....
-----------------------> test.json (from json wikipedia page)
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
------------------------> js.prg
procedure main
Local nLen
Local res
Local o
text = memoread( "test.json" )
nLen := hb_jsondecode( text, @res )
? nLen, " bytes decoded"
? "name:", res["firstName"]
? "postalcode:", res["address"]["postalCode"]
? "fax: "
o := 0
FOR EACH o IN res["phoneNumber"]
if o["type"] == "fax"
?? o["number"]
endif
NEXT
--------------> console output
444 bytes decoded
name: John
postalcode: 10021
fax: 646 555-4567
Se precisar ja sei que tem algo no harbour
Saudações,
Itamar M. Lins Jr.
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 16 Dez 2010 16:44
por sygecom
Olá Itamar,
Para que serve o JSON ? ( nem conheço ele ainda, mas manda um abraço pra ele )
Re: Harbour JSON, JavaScript Object Notation
Enviado: 24 Dez 2010 19:24
por danielgianni
Por favor, peciso de orientações de como instalar essa biblioteca. Sou novato no harbour e apesar deste tópico ser antigo é de total interesse meu.
Eu estou usando em linux (ubuntu 8.04) com harbour 2.0 e instalado a partir dos binários (compilação não obteve sucesso por problemas na sqlite3)??
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 24 Dez 2010 19:27
por danielgianni
sygecon
O JSON é uma notação parecida com XML mas basea-se nos objetos e vetores do javascript.
Olha só
http://pt.wikipedia.org/wiki/JSON
eu uso isso no lugar de banco de dados (para casos menores -- sistema interno com pouco uso simultâneo)
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 24 Dez 2010 19:30
por danielgianni
Mas eu gostaria de saber do
itamar como posso instalar essa biblioteca no harbour 2.0
Estou usando a versão binária no linux ubuntu 8.04 (servidor não posso atualizar para versòes mais recentes)
Mas quando vou compilar teu exemplo dá erro feio:
Código: Selecionar todos
#hbmk js.prg
Harbour 2.0.0 (Rev. 13372)
Copyright (c) 1999-2010, http://www.harbour-project.org/
Compiling 'js.prg'...
Lines 22, Functions/Procedures 1
Generating C source output to 'js.c'... Done.
./js.o:(.data+0x58): undefined reference to `HB_FUN_HB_JSONDECODE'
collect2: ld returned 1 exit status
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 26 Dez 2010 10:28
por Itamar M. Lins Jr.
Ola!
Estou usando a versão binária no linux ubuntu 8.04 (servidor não posso atualizar para versòes mais recentes)
Neste caso não sei como pode fazer, porque acredito que está na versão 2.1 e no diretório RTL, não havendo lib portanto.
Código: Selecionar todos
C:\harbour\trunk\harbour>harbour -build
Harbour 2.1.0beta2 (Rev. 15878)
Copyright (c) 1999-2010, http://harbour-project.org/
Harbour Build Info
---------------------------
Version: Harbour 2.1.0beta2 (Rev. 15878)
Compiler: MinGW GNU C 3.4.5 (32-bit)
Platform: Windows XP 5.1.2600 Service Pack 3
PCode version: 0.3
ChangeLog last entry: 2010-11-24 11:56 UTC+0100 Viktor Szakats (harbour.01 syena
r.hu)
ChangeLog ID: ChangeLog 15878 2010-11-24 10:56:46Z vszakats
Built on: Nov 24 2010 08:06:48
Build options: (Clipper 5.3b) (Clipper 5.x undoc) (UNICODE)
---------------------------
E olhe que já está defasado essa versão que estou usando em relação ao SVN que é:
Inclusive já trabalhando com campos Date e TimeStamp.
2010-10-24 02:21 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/rtl/hbjson.c
+ added support for date and timestamp type encoding
Saudações,
Itamar M. Lins Jr.
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 27 Dez 2010 10:08
por vailton
Olá Daniel,
danielgianni escreveu:Mas eu gostaria de saber do itamar como posso instalar essa biblioteca no harbour 2.0
Estou usando a versão binária no linux ubuntu 8.04 (servidor não posso atualizar para versòes mais recentes)
Uma outra opção que me veio à cabeça seria você baixar em outro local a estrutura SVN, copiar apenas os arquivos fontes que possuem esta funcionalidade e gerar uma LIB do mesmo. Desta forma você usaria esta LIB na sua versão em produção. Consulte o changelog para averiguar quais arquivos são necessários.
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 04 Jan 2011 03:12
por Stanis Luksys
Opa,
Eu coloquei para download um tempo atrás um pequeno exemplo de uso de JSON... É um recurso formidável que para quem pretende integrar plataforma web e desktop utilizando bancos relacionais. Além do mais, é muito útil na criação e consumo de web services.
É importante lembrar que uma vez que o javascript roda no cliente, utilizando JSON, você diminue bastante a carga de processamento do servidor, trazendo dele apenas um texto de dados bruto, para então avaliar localmente. Muito diferente do que até há pouco ainda fazíamos que era executar aqueles scripts PHP imensos no servidor.
O exemplo com aplicação em Harbour é esse:
http://sites.google.com/site/hblibs/exe ... e-com-hbqt
Abraços!
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 04 Jan 2011 07:45
por asimoes
Olá Stanis,
O que é necessário para rodar o exemplo do link?
Eu baixei, mas tem várias dlls dependentes sendo reclamadas.
[]´s
Re: Harbour JavaScript Object Notation(JSON)
Enviado: 04 Jan 2011 18:53
por Stanis Luksys
Opa...
Então... Basicamente você precisa das DLLs do Qt e do MINGW, acontece que mesmo tendo estas DLLs podem ocorrer erros de acordo com as versões, e por este motivo recomendo que baixe os fontes e compile o programa.
O que acontece é o seguinte: O conjunto de bibliotecas Qt tem vários tipos de licença, sendo que a gratuita (LGPL) exige que você linke seu programa dinamicamente, ou seja, se você quer usufruir de graça, necessariamente é obrigado a enviar as DLLs pro usuário final, já se você adquirir uma licença comercial, então pode linkar tudo estaticamente e não precisa enviar as DLLs.
Na verdade, pelo que lí das licenças, até existe uma brecha sim, você pode linkar estaticamente usando a versão LGPL, desde que seu programa também seja coberto por esta licença. Enfim, para usar de graça e não enviar as DLLs, precisa liberar o código do seu programa, não no todo, mas todos os arquivos fontes que fazem referência a qualquer função das bibliotecas deles. Eu não teria problemas com isso, uma vez que o meu código já está disponível, no entanto estou tendo dificuldades para compilar estaticamente, pelo que pergunto se alguém já conseguiu fazer isso!
Bom, acho que saí um pouco do assunto, e não sei se fui claro, mas acho que é interessante entender isso tudo.
Aguarde alguns instantes que vou jogar lá uma outra versão que acredito vai requerer menos DLLs, compilada agora com o MSVC e não mais com o mingw.
Abraços.
Harbour JavaScript Object Notation(JSON)
Enviado: 15 Out 2014 15:14
por vagucs
Amigos,
Estou trabalhando em uns webservice que usam JSON para transporte de dados, e perdi horas por causa do formato maluco de datas que o JSON usa, baseado em milissegundos.
Ai para contribuir, resolvi com esta pequena rotina, poderia fazer em C também, mas esta em puro harbour vale a pena pra aprendizado. Se alguém quiser melhorar vai ser bom.
O Harbour não dá suporte a tal formato, quando se gera um JSON com a HB_JSONENCODE, ela deixa as datas vazias. Isso pode ser muito útil. Ainda uso o Harbour 3.1 e não sei se na versão atual Beta colocaram este suporte.
Código: Selecionar todos
function date_json(xDate,xHora,xUtc)
xDate=(xDate-ctod("01/01/1970"))*86400000
xDate+=(((val(left(xHora,2))*60)*60)*1000)+((val(substr(xHora,4,2))*60)*1000)+(val(right(xHora,2))*1000)
xDate=alltrim(str(xDate))
if xUtc=Nil
xUtc="-0300" // Timezone do Brasil
end if
xDate+=xUtc
xDate='\/Date('+xDate+')\/'
return xDate
function json_date(xDate)
xDate=lower(xDate)
xDate=strtran(xDate,'\/date(')
xDate=strtran(xDate,'/date(')
xDate=strtran(xDate,')/\')
xDate=strtran(xDate,')/')
if "-"$xDate // Retira o timezone
xDate=left(xDate,at("-",xDate)-1)
end if
xDate=val(xDate)
return ctod("01/01/1970")+(xDate/86400000)
Harbour JavaScript Object Notation(JSON)
Enviado: 15 Out 2014 17:16
por Itamar M. Lins Jr.
Coloquei no grupo de desenvolvedores.
Saudações,
Itamar M. Lins Jr.
Harbour JavaScript Object Notation(JSON)
Enviado: 08 Ago 2016 12:27
por asimoes
Pessoal,
Para fazer o encode para gerar um arquivo .json formatado é só usar hb_jsonencode?
A minha duvida é como salvar, existe função para isso ou é posso usar ValToPrg, tipo:
hb_memowrit("new.json", ValToPrg(hRecords))
Harbour JavaScript Object Notation(JSON)
Enviado: 14 Ago 2016 11:16
por vailton
Harbour JavaScript Object Notation(JSON)
Enviado: 13 Abr 2022 21:59
por Linguagemclipper
Como é que eu baixo essa lib do hbjson para o xharbour 1.2.1?