Harbour JavaScript Object Notation(JSON)

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

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Harbour JSON, JavaScript Object Notation

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Harbour JavaScript Object Notation(JSON)

Mensagem por sygecom »

Olá Itamar,
Para que serve o JSON ? ( nem conheço ele ainda, mas manda um abraço pra ele )
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
danielgianni
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 28 Abr 2010 14:20
Localização: Ribeirão Preto - SP

Re: Harbour JSON, JavaScript Object Notation

Mensagem 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)??
danielgianni
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 28 Abr 2010 14:20
Localização: Ribeirão Preto - SP

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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)
danielgianni
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 28 Abr 2010 14:20
Localização: Ribeirão Preto - SP

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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 é:

Código: Selecionar todos

 * $Id: ChangeLog 15972 2010-12-23 21:40:45Z druzus $
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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: Harbour JavaScript Object Notation(JSON)

Mensagem 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.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Harbour JavaScript Object Notation(JSON)

Mensagem 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)
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Harbour JavaScript Object Notation(JSON)

Mensagem por Itamar M. Lins Jr. »

Coloquei no grupo de desenvolvedores.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Harbour JavaScript Object Notation(JSON)

Mensagem 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 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

Harbour JavaScript Object Notation(JSON)

Mensagem por vailton »

Use deste modo:

Código: Selecionar todos

hb_memowrit("new.json", hb_jsonEncode(hRecords))
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Harbour JavaScript Object Notation(JSON)

Mensagem por Linguagemclipper »

Como é que eu baixo essa lib do hbjson para o xharbour 1.2.1?
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Responder