Image Image Image Image Image
Scroll to Top

Topo

JSON

17

maio
2012

Sem Comentários

Em Blog
Dados

Por Allison

PostgreSQL 9.2 beta melhora escalabilidade e adiciona JSON

Em 17, maio 2012 | Sem Comentários | Em Blog, Dados | Por Allison

Fonte: IMasters

Com informações de The H

O beta da versão 9.2 do PostgreSQL foi liberado. A promessa é de que a nova versão traga melhorias em desempenho que habilitem melhor escalabilidade horizontal e vertical. Além disso, uma nova otimização – varredura apenas de índex permite que pesquisas evitem a leitura de tabelas subjacentes e apenas busque pelos índices. A nova funcionalidade acontece automaticamente, mas há vários problemas para sua efetividade.

De acordo com os desenvolvedores, melhorias em lidar com cargas de trabalho somente de leitura permitiram que o banco de dados escalasse usando 64 cores e atuasse em 300 mil consultas por segundo. Também houve mudanças para reduzir o consumo de energia do CPU e melhorias em escalabilidade horizontal incluem suporte para replicação em cascata, considerando cadeias de servidores de replicação e reduzindo requerimentos de transferência de dados entre data centers.

Novas funcionalidades foram adicionadas, incluindo suporte para JSON data type, levando em conta bancos de dados relacionais híbridos que podem armazenar documentos em JSON, e JSON functions, que pode converter array e dados de fila em JSON.

O uso do beta não é recomendado em ambientes de produção e em sistemas de missão crítica. Aqueles dispostos a testá-lo são encorajados a fornecer feedback e a reportar bugs. De acordo com o cronograma do projeto, a versão final do PostgreSQL 9.2 será lançada no terceiro trimestre deste ano.

Mais informações sobre o beta podem ser encontradas nas notas de lançamento de na documentação atualizada. Ele está disponível para download para Windows, Mac OS X, Linux, FreeBSD e Solaris.

Tags | , ,

10

abr
2012

Sem Comentários

Em Blog
Dados

Por Allison

Apache CouchDB 1.2 aumenta velocidade e comprime mais

Em 10, abr 2012 | Sem Comentários | Em Blog, Dados | Por Allison

Fonte: IMasters

Com informações de The H

Os desenvolvedores do Apache CouchDB anunciaram melhorias em desempenho e em segurança na versão 1.2 do banco de dados NoSQL. A atualização também traz uma nova implementação de replicação e o padrão para habilitar compressão de arquivos para o banco de dados e para os arquivos do index view.

Além disso, a nova versão foi lançada junto com uma reforçada presença do banco de dados na Apache Software Foundation.

O CouchDB faz muito uso do format de dados JSON e, na 1.2, os desenvolvedores moveram partes críticas do parser do JSON para o Com (usando a biblioteca yail), que, segundo eles, melhorou a latência e a taxa de transferência do sistema. Bancos de dados e índices para views agora são passados através do sistema de compressão Snappy, do Google, reduzindo a quantidade de dados transferida para e a partir do disco; essa redução em I/O também melhorou o desempenho do banco de dados e permitiu vários aprimoramentos em algoritmos, o que resultou na melhoria de operações comuns, como a construção de views.

A segurança também foi modificada no Apache CouchDB 1.2, o que levou a algumas rupturas de compatibilidade com versões anteriores. Agora, o banco de dados dos usuários não está legível para todos e, ao acessar os dados no replicador do banco de dados, irá retornar documentos retirados de informações confidenciais, como senhas e tokens OAuth. O CouchDB agora gerencia, de forma consistente, o hashing de senhas antes de seu armazenamento, em vez de confiar nos aplicativos do cliente para isso. Além disso, segredos do OAuth dentro do banco de dados e cookies de autenticação persistente também são suportados pelo CouchDB.

Outras mudanças incluem um novo sistema replicador, que, segundo os desenvolvedores, é mais confiável e rápido que o anterior; maior abrangência de opções de configuração para permitir melhor tuning para ambientes particulares; e melhorias no sistema de building e de logging, além de várias correções de bugs.

Detalhes estão disponíveis aqui. O Apache CouchDB 1.2 pode ser baixado neste link, e uma versão para Mac OS X chegará em breve.

Tags | , , ,

10

abr
2012

Sem Comentários

Em Blog
JavaScript
JSON

Por Allison

Como obter e tratar um retorno em JSON com o Wrapper .Net

Em 10, abr 2012 | Sem Comentários | Em Blog, JavaScript, JSON | Por Allison

Fonte: Buscapé Developer/IMasters

Veremos, neste artigo, uma das formas que temos de tratar os dados de um retorno em JSON utilizando o wrapper .Net.

Para começar, faça o download do Wrapper .Net direto do nosso perfil no GitHub e inclua seus arquivos em seu projeto para utilizar a classe Apiki_Buscape_API.

Com os arquivos do Wrapper .Net devidamente inseridos no projeto, vamos instanciar um objeto da classe, que servirá como nosso objeto de negócio principal. Como já estamos acostumados, devemos informar ao construtor da classe o nosso ApplicationId, para identificar a aplicação na requisição ao Buscapé. Pórem, neste exemplo também devemos sobreescrever o formato padrão de retorno dos dados para o JSON. Portanto, temos que informar valores default para os outros parâmetros do construtor da classe e informar o formato como JSON.

Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d", string.Empty, "BR", "json");

Para este artigo, vamos utilizar o método FindCategoryList, porque ele tem uma estrutura de retorno menos complexa. Consulte a documentação desse serviço na API do Buscapé, se desejar mais informações sobre os campos de resposta.

Vamos, então, invocar o método FindCategoryList com a palavra-chave LG e salvar o seu retorno em uma string.

string categoryList = apiBuscape.FindCategoryList(null, "LG", string.Empty);
Response.Write(categoryList);

Exibindo a resposta na tela, podemos ver o objeto JSON que foi retornado pelo método:

{"details":{"message":"success","elapsedtime":31,"status":"success","code":0,"applicationversion":"1.0.0.0","date":{"minute":2,"valid":true,"timezone":-120,"second":30,"millisecond":770,"month":2,"year":2012,"hour":10,"day":13,"xmlschematype":{"namespaceuri":"http://www.w3.org/2001/XMLSchema","prefix":"","localpart":"dateTime"},"eonandyear":{"lowestsetbit":2}},"applicationpath":"http://bws-apps.buscape.com/mobile/update","applicationid":"564771466d477a4458664d3d"},"schk":true,"subcategory":[{"subcategory":{"id":2852,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/2852.jpg"},"hasoffer":false,"name":"TV","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/tv.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=2852&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":77,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/77.jpg"},"hasoffer":false,"name":"Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=77&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3661,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3661.jpg"},"hasoffer":false,"name":"Ar Condicionado","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/ar-condicionado.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3661&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6424,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6424.jpg"},"hasoffer":false,"name":"Notebook","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/notebook.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6424&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":36,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/36.jpg"},"hasoffer":false,"name":"Monitor","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/monitor.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=36&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3673,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3673.jpg"},"hasoffer":false,"name":"Geladeira / Refrigerador","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/geladeira-refrigerador.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3673&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3643,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3643.jpg"},"hasoffer":false,"name":"Home Theater","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/home-theater.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3643&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3601,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3601.jpg"},"hasoffer":false,"name":"Micro System / Mini System","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/micro-system-mini-system.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3601&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":5,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/5.jpg"},"hasoffer":false,"name":"DVD Player","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/dvd-player.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=5&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3671,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3671.jpg"},"hasoffer":false,"name":"Máquina de Lavar Roupas","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/maquina-de-lavar-roupas.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3671&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6168,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6168.jpg"},"hasoffer":false,"name":"Gravador","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/gravador.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6168&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9754,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9754.jpg"},"hasoffer":false,"name":"Blu-Ray Player / HD-DVD Player","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/blu-ray-player-hd-dvd-player.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=9754&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":126,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/126.jpg"},"hasoffer":false,"name":"Microondas","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/microondas.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=126&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":37,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/37.jpg"},"hasoffer":false,"name":"Projetor Multimídia","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/projetor-multimidia.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=37&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":5839,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/5839.jpg"},"hasoffer":false,"name":"Auto-Rádio CD Player","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/auto-radio-cd-player.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=5839&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":119,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/119.jpg"},"hasoffer":false,"name":"Aspirador de Pó / Água","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/aspirador-de-po-agua.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=119&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":145,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/145.jpg"},"hasoffer":false,"name":"Forno Elétrico","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/forno-eletrico.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=145&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6507,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6507.jpg"},"hasoffer":false,"name":"Adega Climatizada","parentcategoryid":116,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/adega-climatizada.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6507&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3737,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3737.jpg"},"hasoffer":false,"name":"HD","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/hd.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3737&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":8727,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/8727.jpg"},"hasoffer":false,"name":"Pen Drive","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/pen-drive.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=8727&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3429,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3429.jpg"},"hasoffer":false,"name":"Mouse","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/mouse.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3429&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":22,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/22.jpg"},"hasoffer":false,"name":"PC","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/pc.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=22&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3482,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3482.jpg"},"hasoffer":false,"name":"Livros","parentcategoryid":3482,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/livros.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3482&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":80,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/80.jpg"},"hasoffer":true,"name":"Outros Acessórios para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/outros-acessorios-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=80&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4699,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4699.jpg"},"hasoffer":true,"name":"Carregador para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/carregador-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4699&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9937,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9937.jpg"},"hasoffer":true,"name":"Fonte para Notebook","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/fonte-para-notebook.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=9937&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6359,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6359.jpg"},"hasoffer":true,"name":"Jaqueta Feminina","parentcategoryid":2468,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/jaqueta-feminina.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=6359&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4666,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4666.jpg"},"hasoffer":true,"name":"Bateria para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/bateria-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4666&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":2921,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/2921.jpg"},"hasoffer":true,"name":"CDs","parentcategoryid":2921,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/cds.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=2921&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9938,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9938.jpg"},"hasoffer":true,"name":"Bateria para Notebook","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/bateria-para-notebook.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=9938&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9941,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9941.jpg"},"hasoffer":true,"name":"Outros Acessórios para Notebook","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/outros-acessorios-para-notebook.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=9941&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4671,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4671.jpg"},"hasoffer":true,"name":"Fone de Ouvido para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/fone-de-ouvido-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4671&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4667,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4667.jpg"},"hasoffer":true,"name":"Capa para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/capa-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4667&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9469,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9469.jpg"},"hasoffer":true,"name":"Cabo de Dados para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/cabo-de-dados-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=9469&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7918,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7918.jpg"},"hasoffer":true,"name":"Câmera de Segurança","parentcategoryid":2701,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/camera-de-seguranca.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7918&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":10800,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/10800.jpg"},"hasoffer":true,"name":"Óculos 3D","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/oculos-3d.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=10800&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":18,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/18.jpg"},"hasoffer":false,"name":"MP3 Player / MP4 Player","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/mp3-player-mp4-player.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=18&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":8241,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/8241.jpg"},"hasoffer":true,"name":"Outros Serviços em Construção Civil","parentcategoryid":5845,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/outros-servicos-em-construcao-civil.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=8241&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":16,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/16.jpg"},"hasoffer":false,"name":"Fone de Ouvido / Headset","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/fone-de-ouvido-headset.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=16&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":103,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/103.jpg"},"hasoffer":false,"name":"WebCam","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/webcam.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=103&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4669,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4669.jpg"},"hasoffer":true,"name":"Kit Viva Voz para Celular e Smartphone","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/kit-viva-voz-para-celular-e-smartphone.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4669&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":2947,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/2947.jpg"},"hasoffer":false,"name":"Mochila","parentcategoryid":1328,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/mochila.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=2947&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4632,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4632.jpg"},"hasoffer":true,"name":"Outros Acessórios para Áudio / Vídeo","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/outros-acessorios-para-audio-video.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4632&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":75,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/75.jpg"},"hasoffer":false,"name":"Roteador","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/roteador.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=75&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7356,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7356.jpg"},"hasoffer":true,"name":"Assistência Técnica de Equipamentos de Informática","parentcategoryid":5845,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/assistencia-tecnica-de-equipamentos-de-informatica.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7356&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6399,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6399.jpg"},"hasoffer":false,"name":"Auto-DVD Player","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/auto-dvd-player.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6399&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":3772,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/3772.jpg"},"hasoffer":false,"name":"Aparelho Telefônico","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/aparelho-telefonico.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=3772&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":172,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/172.jpg"},"hasoffer":true,"name":"Leitor de Cartão de Memória","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/leitor-de-cartao-de-memoria.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=172&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9532,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9532.jpg"},"hasoffer":true,"name":"Imóveis Residenciais","parentcategoryid":9549,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/imoveis-residenciais.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=9532&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7985,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7985.jpg"},"hasoffer":true,"name":"Serviços em Pisos","parentcategoryid":5845,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/servicos-em-pisos.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7985&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7349,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7349.jpg"},"hasoffer":true,"name":"Assessoria Contábil","parentcategoryid":5845,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/assessoria-contabil.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7349&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7334,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7334.jpg"},"hasoffer":true,"name":"Aluguel de Automóvel","parentcategoryid":5845,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/aluguel-de-automovel.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7334&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":52,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/52.jpg"},"hasoffer":false,"name":"Cartão de Memória","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/cartao-de-memoria.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=52&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":62,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/62.jpg"},"hasoffer":false,"name":"Caixa de Som para PC","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/caixa-de-som-para-pc.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=62&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":111,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/111.jpg"},"hasoffer":false,"name":"Vídeo Cassete","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/video-cassete.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=111&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":2782,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/2782.jpg"},"hasoffer":true,"name":"Controle Remoto","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/controle-remoto.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=2782&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":4029,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/4029.jpg"},"hasoffer":true,"name":"Suplementos Nutricionais Esportivos","parentcategoryid":1328,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/suplementos-nutricionais-esportivos.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=4029&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":2794,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/2794.jpg"},"hasoffer":true,"name":"Massageador Elétrico","parentcategoryid":249,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/massageador-eletrico.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=2794&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7606,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7606.jpg"},"hasoffer":true,"name":"Música Digital","parentcategoryid":7606,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/musica-digital.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7606&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7157,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7157.jpg"},"hasoffer":true,"name":"Apostila para Concursos / Cursos","parentcategoryid":6108,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/apostila-para-concursos-cursos.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7157&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":6976,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/6976.jpg"},"hasoffer":false,"name":"Mala","parentcategoryid":2468,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/mala.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6976&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":10369,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/10369.jpg"},"hasoffer":true,"name":"Lâmpada para Projetor","parentcategoryid":2,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/lampada-para-projetor.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=10369&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":9825,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/9825.jpg"},"hasoffer":false,"name":"Carros","parentcategoryid":3841,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/carros.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=9825&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":10586,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/10586.jpg"},"hasoffer":true,"name":"Outros Acessórios para Aparelhos Telefônicos","parentcategoryid":6420,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/outros-acessorios-para-aparelhos-telefonicos.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=10586&keyword=lg&format=json"}}],"isfinal":true}},{"subcategory":{"id":7444,"thumbnail":{"url":"http://imagem.buscape.com.br/bp5/categorias/7444.jpg"},"hasoffer":true,"name":"Tela de Projeção","parentcategoryid":1,"links":[{"link":{"type":"category","url":"http://compare.buscape.com.br/tela-de-projecao.html?mdapp=100&mddtn=69672797"}},{"link":{"type":"xml","url":"http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?categoryId=7444&keyword=lg&format=json"}}],"isfinal":true}}],"totalresultsavailable":65,"totalresultsreturned":65}

Para converter os dados do retorno, vamos utilizar a classe JavaScriptSerializer presente no namespace System.Web.Script.Serialization do .NET, portanto não esqueçam de utilizar a diretiva using com esse namespace antes de iniciar.

Após instanciar um objeto da classe JavaScriptSerializer, vamos utilizar o método Deserialize<T>() para transformar o objeto JSON principal em um objeto do tipo Dictionary<string, object>. Depois vamos pegar o nó subcategory do JSON, indexando o objeto Dictionary criado.

JavaScriptSerializer deserializer = new JavaScriptSerializer();
Dictionary<string, object> data = deserializer.Deserialize<Dictionary<string, object>>(categoryList);
ArrayList subcategories = (ArrayList)data["subcategory"];

Como temos vários objetos JSON dentro de subcategory, ele nos retorna um tipo ArrayList com todas as categorias retornadas. Devemos, então, percorrer esse objeto para tratar cada atributo das categorias.

foreach (Dictionary<string, object> sub in subcategories)
{
// Aqui pegamos cada um dos atributos
}

A primeira coisa que vamos fazer é instanciar um objeto do tipo Dictionary<string, object> para receber os dados da categoria.

Dictionary<string, object> subData = (Dictionary<string, object>)sub["subcategory"];

A forma que acessamos os atributos do objeto convertido é indexanda ao objeto com o nome do atributo que desejamos – por exemplo para recuperar o nome da categoria usamos subData[“name”]. Simples, não?

Para não dizer que é tão simples assim, temos dois atributos que vamos ter um pouco mais de trabalho para recuperar seu valor: o thumbnail e a url. Para o thumbnail, com apenas mais um índice conseguimos seu valor. Já para a URL teremos algumas linhas a mais para conseguir:

// Recuperando o link para imagem da categoria
Dictionary<string, object> thumbnail = (Dictionary<string, object>)subData["thumbnail"];

// Recuperando a URL para os produtos da categoria
ArrayList links = (ArrayList)subData["links"];
Dictionary<string, object> productLink = (Dictionary<string, object>)links[1];
Dictionary<string, object> link = (Dictionary<string, object>)productLink["link"];

Pronto, com esses dois últimos atributos setados, podemos exibir os dados de retorno:

Response.Write(string.Format("<img src=\"{0}\" alt=\"{1}\" /> <br />", thumbnail["url"], subData["name"]));
Response.Write(string.Format("Categoria: {0} - {1} <br />", subData["id"], subData["name"]));
Response.Write(string.Format("Link para os produtos: <a href=\"{0}\">{0}</a> <br />", link["url"]));
Response.Write(string.Format("Tem Oferta: {0} - ID categoria pai: {1} - é final? {2} <br />", subData["hasoffer"], subData["parentcategoryid"], subData["isfinal"]));
Response.Write("<hr />");

É isso aí pessoal! Dessa forma, conseguimos trabalhar com o retorno em JSON da API do Buscapé utilizando somente as classes padrões do framework .NET, sem a necessidade de um componente extra. Abaixo, deixo o código completo utilizado neste artigo para não ficar nenhuma dúvida.

// Recuperando os dados em JSON
Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d", string.Empty, "BR", "json");
string categoryList = apiBuscape.FindCategoryList(null, "LG", string.Empty);

// Convert o JSON em uma coleção do tipo Dictionary e separa somente o nó subcategory em um array list
JavaScriptSerializer deserializer = new JavaScriptSerializer();
Dictionary<string, object> data = deserializer.Deserialize<Dictionary<string, object>>(categoryList);
ArrayList subcategories = (ArrayList)data["subcategory"];

foreach (Dictionary<string, object> sub in subcategories)
{
Dictionary<string, object> subData = (Dictionary<string, object>)sub["subcategory"];

// Recuperando o link para imagem da categoria
Dictionary<string, object> thumbnail = (Dictionary<string, object>)subData["thumbnail"];

// Recuperando a URL para os produtos da categoria
ArrayList links = (ArrayList)subData["links"];
Dictionary<string, object> productLink = (Dictionary<string, object>)links[1];
Dictionary<string, object> link = (Dictionary<string, object>)productLink["link"];

Response.Write(string.Format("<img src=\"{0}\" alt=\"{1}\" /> <br />", thumbnail["url"], subData["name"]));
Response.Write(string.Format("Categoria: {0} - {1} <br />", subData["id"], subData["name"]));
Response.Write(string.Format("Link para os produtos: <a href=\"{0}\">{0}</a> <br />", link["url"]));
Response.Write(string.Format("Tem Oferta: {0} - ID categoria pai: {1} - é final? {2}

Tags | , , , ,

11

jan
2012

Sem Comentários

Em Blog
Java
JSON

Por Allison

Nova API JSON padrão para Java será desenvolvida

Em 11, jan 2012 | Sem Comentários | Em Blog, Java, JSON | Por Allison

Uma nova interface Java para processamento de dados no formato JSON foi aprovada pela Java Community Process (JCP) como uma Java Specification Request (JSR).

Com 10 votos a favor e 6 abstenções, o comitê executivo votou a favor do JSR 353, que, primeiramente, tem como objetivo ser a base para o desenvolvimento padronizado para futuras APIs JSON e vai permitir que aplicativos sejam menores e mais portáveis por não terem o pacote existente nas bibliotecas JSON.

A proposta planeja capacitar a produção e o consumo do texto JSON, em um estilo semelhante ao da API StAX usada para XML. Além disso, ela está focada na produção de um modelo de objeto e de uma API para texto JSON, em um estilo semelhante ao da API DOM para XML.

O pedido aponta especificamente que ligar o texto JSON a objetos Java, e vice-versa, não é a meta da especificação. Os desenvolvedores afirmaram que pretendem integrar o JSR 353 no Java EE 7, assim como oferecer uma variante independente para o for Java SE 6 e superior.

O SouJava, grupo de usuários brasileiros, votou a favor do JSR e comentou favoravelmente a respeito do trabalho da especificação, liderado por Jitendra Kotamraju, que, segundo eles, já demonstrou sua habilidade em envolver desenvolvedores a partir da comunidade mais ampla. A IBM também se manifestou e afirmou que seu voto a favor do JSR foi exclusivamente baseado nos méritos técnicos do JSR 353.

Com informações de The H

Fonte: IMasters

Tags | , , , ,

05

jan
2012

Sem Comentários

Em Blog
JavaScript
JSON

Por Allison

Introdução: JSON

Em 05, jan 2012 | Sem Comentários | Em Blog, JavaScript, JSON | Por Allison

Afinal, o que é JSON?

JSON é basicamente um formato leve de troca de informações/dados entre sistemas. Mas JSON significa JavaScript Object Notation, ou seja, só posso usar com JavaScript correto? Na verdade não e alguns ainda caem nesta armadilha.

O JSON além de ser um formato leve para troca de dados é também muito simples de ler. Mas quando dizemos que algo é simples, é interessante compará-lo com algo mais complexo para entendermos tal simplicidade não é? Neste caso podemos comparar o JSON com o formato XML.

Vamos visualizar esta diferença?


XML

<?xml version="1.0" encoding="UTF-8"?>
  <id>1</id>
  <nome>Alexandre Gama</nome>
  <endereco>R. Qualquer</endereco>
</xml>

JSON

{"id":1,"nome":"Alexandre Gama", "endereco":"R. Qualquer"}

Bom, é notável a diferença. Visualmente o segundo trecho (em JSON) é mais fácil de ler. Mas só existe essa diferença entre os dois? Na verdade não. Podemos listar algumas outras vantagens:

Vantagens do JSON:

– Leitura mais simples

– Analisador(parsing) mais fácil

– JSON suporta objetos! Sim, ele é tipado!

– Velocidade maior na execução e transporte de dados

– Arquivo com tamanho reduzido

– Quem utiliza? Google, Facebook, Yahoo!, Twitter…

Estas são algumas das vantagens apresentadas pelo JSON. Agora vamos ao que interessa: Código!

Vamos fazer um exemplo extremamente simples nesta primeira parte e avançaremos no próximo artigo, inclusive falando sobre JSON em páginas Web.

Qual biblioteca usar?

Existem diversas bibliotecas para trabalharmos com JSON e Java. Usaremos no nosso estudo o json.jar que você pode baixar tranquilamente neste link

O nosso caso de estudo será simples: Teremos uma classe Carro que será a nossa classe POJO e a classe EstudoJSON que terá o nosso famoso método main.

Classe Carro

package br.com.json;

public class Carro {
    private Long id;
    private String modelo;
    private String placa;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getModelo() {
        return modelo;
    }
    public void setModelo(String modelo) {
        this.modelo = modelo;
    }
    public String getPlaca() {
        return placa;
    }
    public void setPlaca(String placa) {
        this.placa = placa;
    }

        //Aqui fizemos o Override do método toString() para visualizar a impressão com o System.out.println()
    @Override
    public String toString() {
        return "[id=" + id + ", modelo=" + modelo + ", placa=" + placa
                + "]";
    }

}

Esta é uma classe simples, onde temos os atributos Id, Modelo e Placa.

Agora teremos a classe EstudoJSON

package br.com.json;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class EstudoJSON {
    public static void main(String[] args) throws JSONException {
        adicaoSimplesDeDados();
    }
}

Repare que criamos o método adicaoSimplesDeDados() que conterá o código de exemplo:

private static void adicaoSimplesDeDados() throws JSONException {
    //Criação do objeto carro e atribuição dos valores
    Carro carro = new Carro();
    carro.setId(1);
    carro.setModelo("Celta");
    carro.setPlaca("AAA1234");

    //Criação do objeto carroJson
    JSONObject carroJson = new JSONObject();
    //Inserção dos valores do carro no objeto JSON
    carroJson.put("id", carro.getId());
    carroJson.put("Modelo", carro.getModelo());
    carroJson.put("Placa", carro.getPlaca());

    //Impressão do objeto JSON
    System.out.println(carroJson);
}

Se executarmos este código, veremos que foi impresso no console o seguinte:

{"id":1,"Modelo":"Celta","Placa":"AAA1234"}

Você desenvolvedor mais atento vai reparar que existe um objeto impresso: Um Long! Isso mesmo! Como vimos, o JSON consegue armazenar objetos! Podemos inclusive armazenar um objeto do tipo Carro mesmo:

Modificamos o nosso método main:

public class EstudoJSON {
    public static void main(String[] args) throws JSONException {
        adicaoSimplesDeDados();

        adicaoDeUmObjeto();
    }
}

E adicionamos o método adicaoDeUmObjeto():

private static void adicaoDeUmObjeto() throws JSONException {
    Carro carro = new Carro();
    carro.setId(1l);
    carro.setModelo("Celta");
    carro.setPlaca("AAA1234");

    JSONObject carroJson = new JSONObject();
    //Adição do objeto carro
    carroJson.put("Carro", carro);

    System.out.println(carroJson);
}

Neste caso foi impresso no console o seguinte:

{"Carro":"[id=1, modelo=Celta, placa=AAA1234]"}

Simples não?

Como o JSON trabalha com coleção de pares nome/valor, podemos imprimir um valor específico simplesmente chamando o nome que desejamos.

System.out.println(carroJson.get("Modelo"));

Conclusão

É isso pessoal! Vimos as vantagens do JSON e vimos como é simples começar a trabalhar com ele.

Fonte: Alexandre Gama/devmedia

Tags | , , , ,

05

jan
2012

Sem Comentários

Em Blog
Python
Rails
Ruby

Por Allison

Como Ruby vem ganhando a prefrência do Python para administração de sistemas

Em 05, jan 2012 | Sem Comentários | Em Blog, Python, Rails, Ruby | Por Allison

Há cerca de três anos, eu comprei o livro “Python for Unix and Linux System Administration“, e ele me convenceu de que o Python seria a linguagem padrão de scripts para administradores do sistema Linux no futuro próximo. Eu estava trabalhando no projeto One Laptop Per Child (Um Laptop Por Criança) na época, onde o Python era a linguagem comum. Parecia que o Red Hat estava usando o Python para quase todo novo projeto. Além disso, o Unladen Swallow estava fazendo um progresso rápido. Eu não poderia estar mais errado.

Através de uma combinação de acidente histórico e algumas diferenças de recursos aparentemente pequenas, o Ruby está, inexoravelmente, se tornando a linguagem padrão dominante para a administração do sistema Linux.

Antes de eu ir mais adiante, seus administradores de sistema estão provavelmente gritando “Nós já temos uma linguagem de scripts, Bash!”. Mesmo amando Bash e commandlinefu, o Bash se torna uma obrigação, não uma qualidade quando seu script excede 100 linhas, e um completo pesadelo se você precisa analisar ou dar saída em HTML, CSV, XML, JSON etc.

Acidentes históricos

Em 2004, Luke Kanies falou sobre a construção do Puppet, um sistema de gerenciamento de configuração para melhorar as deficiências que ele via na CFEngine. Do excelente blog On Ruby:

Eu tentei implementar minha ideia em Perl, mas eu simplesmente não conseguia fazer os relacionamentos de classe funcionar (todos atributos e tipos de recursos precisavam ser classes, de acordo com o design na minha cabeça). Isso era quando o Python era o melhor, então eu naturalmente o experimentei, mas o Python simplesmente faz meus olhos sangrarem (e não, não era o espaço em branco, eram coisas como o fato de que `print` era uma instrução em vez de uma função, e `len` era uma função ao invés de um método).

Eu tinha um amigo que tinha ouvido falar que o Ruby era legal, mas não tinha de fato testado. Como eu estava simplesmente à toa na época, pensei em dar uma olhada. Quatro horas depois, nunca tendo visto uma linha de Ruby antes, eu tinha um protótipo funcional.

Dois anos depois, muitos desenvolvedores Puppet sentiram que o Puppet não satisfazia suas necessidades. Eles começaram suas própria ferramenta de configuração de gerenciamento, Chef, largamente inspirada pelo Puppet. A grande diferença entre Puppet e Chef é que Chef utiliza Ruby puro como “receita”, enquanto o Puppet usa sua própria linguagem de configuração baseada no Ruby.

Ambos Puppet e Chef estão sendo adotados rapidamente por grandes empresas, de acordo com a BusinessWeek. Se você ainda não estiver usando Puppet ou Chef, você deve começar a planejar a usá-los no futuro. Seja escolhendo Chef ou Puppet, você terá efetivamente o script da sua infraestrutura em Ruby. Depois de gastar 25% do seu tempo trabalhando com Puppet, você estará muito mais inclinado a escolher o Ruby para sua própria tarefa de scripting.

Projetos populares


Aqui está uma lista não definitiva de projetos sysadmin/devops em ruby

  • puppet
  • chef
  • vagrant
  • mcollective
  • cucumber (behavior-driven testing)
  • capistrano
  • rake (ruby Make)
  • aeolus project/openshift
  • cloud foundry
  • graylog2
  • logstash
  • travis-ci

e em Python:

  • openstack
  • cobbler
  • fabric
  • func
  • buildbot

O que é importante aqui não é o comprimento das respectivas listas, mas a importância dos projetos individuais. Chef, Puppet e Vagrant são os novos martelos e chaves-de-fenda da administração de sistemas. Se você for um administrador de sistema e ainda não está usando essas ferramentas, não se preocupe, você irá, cedo ou tarde.

O Openstack merece uma atenção especial, e é um projeto muito animador, mas ainda está no seu estágio inicial. Ele pode representar um papel importante no seu futuro como administrador do sistema.

Por favor, me notifique de projetos devops significantes que estão faltando nessa lista.

O que um administrador de sistema quer

Aqui estão os recursos em uma linguagem script que um administrador de sistema quer:

  • Um DSL para o problema do domínio
  • Alta produtividade, por exemplo, sintaxe expressiva e concisa
  • Fácil interação com comandos shell
  • Expressões regulares
  • Comandos de linha poderosos

Note que desempenho não está na lista de necessidades. O Ruby é acentuadamente mais lento que o Pyhton, e isso era particularmente verdade para a série 1.8.* do Matz Ruby Interpreter (MRI). No entanto, desempenho simplesmente não é algo crítico para 90% do nosso trabalho como administradores de sistema. Nós nos importamos mais com produtividade do que com desempenho. Legibilidade é legal, mas está um segundo distante de produtividade.

O Python não tem expressões regulares nativamente, provavelmente para melhorar a legibilidade. Ele também limita o número de variáveis globais de alto nível embutidas. De uma perspectiva de design de linguagem, isso é muito mais limpo. Da perspectiva do seu administrador de sistema padrão, treinado na rua, estressado, viciado em VI, é irritante.

Essas variáveis de alto nível também deixam as ONE_LINERS mais concisas. Aqui estão algumas.

$_ last line read from STDIN
$? last exit code from a child process
$stdin reference to stdin
$stderr reference to stdout
$stdout reference to stdout

Aqui está uma sessão IRB para mostrar esses valores em ação.

hitman@hiroko:~/pr$ irb
irb(main):001:0> %x[ ls -a ]
=> ".\n..\nfoo1\nfoo2\nfoo3\n"
irb(main):002:0> puts $?
0
=> nil
irb(main):003:0> %x[ ls xys ]
ls: cannot access xys: No such file or directory
=> ""
irb(main):004:0> puts $?
512
=> nil

“IRB?” você me zomba, “Você terá que arrancar o IPython das minhas mãos mortas geladas.”

Eu adoro o IPython. Eu usei o IPython por mais de quatro anos, e o IRB não tem comparação a ele. Dito isso, os atalhos do Ruby são bastante úteis, o suficiente pra compensar as deficiências do IRB. Existe algo chamado wirble que eu ainda não tentei, mas ele pode deixar o IRB bem mais produtivo.

Aqui está algum código Python para detectar se uma máquina é VMware VM.

# edit: fixed python code tks to kstrauser

import os
  if 'vmware' in os.popen('dmidecode').upper():
    print 'this is a vmware vm'
  else:
    print 'this is not a vmware vm'

Aqui está o mesmo código em Ruby:

`dmidecode`
if $_ ~= /vmware/i
   puts 'this is a vmware vm'
else
   puts 'this is not a vmware vm'

Francamente, esse tipo de código faz meus olhos sangrarem. O exemplo do Python é muito mais legível e mais fácil de manter. Dito isso, muitos dos administradores de sistema iriam gostar de quão conciso é o exemplo do Ruby.

Vamos ver como escrever comandos de linha em ambas as linguagens.

O código imprime as primeiras 10 linhas em um arquivo usando Python.

python -c "import sys; sys.stdout.write(''.join(sys.stdin.readlines()[:10]))" < /path/to/your/file

Aqui está o mesmo código em ruby:

ruby -ne 'puts $_ if $. <= 10 ' < /path/to/your/file

Compare você mesmo essas coleções de oneliners no Python e no Ruby. Se o Ruby te lembra o Perl, seus olhos não te enganam. Em muitas maneiras, ele é o filho querido do Perl e do Smalltalk.

DSLs FTW

Há algum tempo, eu tentei assistir a todas as palestras da Structure and Interpretation of Computing. Todo esse esforço falhou miseravelmente, mas eu me lembro de Harold Abelson dizendo que todo grande programa deveria ter seu próprio DSL interno adequado para o problema de espaço. Isso é debatível devido ao grande mundo da programação, mas eu acredito estar apto para a administração de sistemas. Passamos toda nossa carreira com vários DSLs diferentes. Cada formato de arquivo com configuração diferente é seu próprio DSL.

Se você comparar o rake (Ruby Make) ao código rails, eles parecem muito diferentes, quase linguagens diferentes. Se você comparar o código fabric a uma classe django, eles se parecem muito. Isso é uma força e uma responsabilidade. Não sou nenhum advogado de linguagem, mas parece muito mais fácil criar DSLs (Domain Specific Languages). O Ruby certamente gera DSLs com uma frequência muito maior do que o Python. Nenhuma ferramenta de construção do Python domina o problema de espaço como o rake faz na comunidade Ruby. A maioria dos projetos Python parece usar setup.py para tarefas administrativas, mesmo este não sendo seu objetivo explícito.

Ambos, Puppet e Chef são DSL para administração de sistemas. O Capistrano é uma DSL para deploy de aplicações. Sobrecarga de operadores e os blocos do Ruby facilitam a criação de DSLs.

Em resumo

A maior força do Ruby é sua grande flexibilidade. Existe muita “mágica” no Ruby, e às vezes essa magia é negra. O Python intencionalmente tem o mínimo de mágica. Sua maior força é a capacidade de reforçar as boas práticas através da sua comunidade. Essas práticas tornam o Python bastante legível em vários projetos. Eles garantem alta qualidade de documentação, fazendo sua biblioteca padrão arrasar. Mas o fato é que nós sysadmin precisamos de flexilidade mais do que precisamos de poder ou consistência. Mesmo assim, esses não são os motivos reais pelos quais o Ruby está tomando o lugar do Python.

O Ruby está rapidamente se tornando a linguagem de script para os administradores de sistema porque, em 2004, Luke Kanies olhou para o Python e se sentiu doente (eu tive a reação oposta). Como um administrador de sistema, você ou está ou logo estará usando o Puppet ou o Chef diariamente, gastando muito tempo essencialmente codificando em Ruby. Pessoalmente, eu prefiro em Python, mas estou mudando a escrita dos meus scripts para Ruby porque passo muito tempo no Chef.

Texto original em inglês de Bryan Berry, disponível em http://devopsanywhere.blogspot.com/2011/09/how-ruby-is-beating-python-in-battle.html

Fonte: Bryan Willson Berry/IMasters

Tags | , , , , , ,

02

dez
2011

Sem Comentários

Em Blog
Java
Testes

Por Allison

Restfuse 1.0.0: uma biblioteca para facilitar testes de integração REST/HTTP

Em 02, dez 2011 | Sem Comentários | Em Blog, Java, Testes | Por Allison

A EclipseSource lançou a primeira versão estável de uma extensão open souce do JUnit para automação de testes de serviços REST/HTTP. O Restfuse é um conjunto de anotações para JUnit que oferece asserções para respostas de requisições HTTP. Tanto chamadas síncronas como assíncronas são suportadas.

O Restfuse já está disponível no Maven Central, então para usá-lo não é necessário nenhum repositório especial:

<dependency>
<groupId>com.restfuse</groupId>
<artifactId>com.eclipsesource.restfuse</artifactId>
<version>1.0.0</version>
</dependency>

Usar a biblioteca para chamadas síncronas é simples e direto:

@RunWith(HttpJUnitRunner.class)
public class RestFuseTest {
@Rule
public Destination destination = new Destination("http://example.com" );

@Context
private Response response; // será injetado depois de cada chamada
@HttpTest(method = Method.GET, path = "/reloadLocalConfiguration" )
public void checkRestfuseOnlineStatus() {
assertOk(response );
String answerBody = response.getBody(String.class);
assertEquals("Expected correct response","done",answerBody);
}
}

O teste acima chama um endereço HTTP de maneira síncrona e então valida se há uma resposta textual (text/plain) contendo a string “done”. Note que a primeira asserção, assertOk, é do Restfuse; ela verifica se o status da resposta HTTP foi 200 OK. A segunda asserção, assertEquals, verifica a igualdade como no JUnit. Embora esteja se supondo que o endereço HTTP vai retornar um texto puro, poderia também ser processado conteúdo em JSON/XML ou de outro tipo, e executar os asserts de maneira estruturada.

O Restfuse também suporta chamadas assíncronas. Uma aplicação clássica disso se dá em operações de longa duração (como o upload de um arquivo extenso), em que o cliente monitora continuamente o servidor para identificar o status atual. No exemplo abaixo, é considerado um endereço do lado servidor que retorna um número entre 0 e 100 e mostra o progresso de alguma operação:

@RunWith( HttpJUnitRunner.class )
public class PollTest1 {

@Rule
public Destination destination = new Destination( "http://example.com" );

@Context
private Response response;

@Context
private PollState pollState;

@HttpTest( method = Method.GET, path = "/progressStatus" )
@Poll( times = 5, interval = 500 )
public void testAsynchronousService() {
if(pollState.getTimes() == 5)
{
String answerBody = response.getBody(String.class);
assertEquals("Expected last response","100",answerBody);
}
}
}

O teste acima chama o mesmo endereço cinco vezes (com um intervalo definido), mas somente a última chamada verifica a resposta HTTP.

Uma característica interessante da interface PollState é a manutenção das respostas anteriores. Isto permite aos asserts sejam feitos sobre o histórico das chamadas:

@RunWith( HttpJUnitRunner.class )
public class PollTest2 {

@Rule
public Destination destination = new Destination( "http://example.com" );

@Context
private Response response;

@Context
private PollState pollState;

@HttpTest( method = Method.GET, path = "/progressStatus" )
@Poll( times = 5, interval = 500 )
public void testAsynchronousService() {
int currentRun = pollState.getTimes();
if(currentRun > 1)
{
String previousProgress = pollState.getResponse(currentRun - 1).getBody(String.class);
String presentProgress = response.getBody(String.class);
assertTrue("Expected some progress",Integer.parseInt(presentProgress) > Integer.parseInt(presentProgress)); //Just for illustration purposes
}
}
}
}

O teste acima verifica se cada resposta tem número superior à resposta anterior. O Restfuse tem uma dependência com o servidor HTTP Jetty e suporta serviços assíncronos que seguem o modelo de Web Hooks. Ao invés de enviar várias requisições ao servidor para verificar o estado de um processo, o cliente cliente faz uma chamada uma única vez e então aguarda por uma resposta iniciada pelo servidor em uma conexão diferente. Aqui está um exemplo usando Restfuse:

 
@RunWith( HttpJUnitRunner.class )
public class RestfuseCalbackTest {

@Rule
public Destination destination = new Destination( "http://example.com" );

@Context
private Response response;

private class TestCallbackResource extends DefaultCallbackResource {

@Override
public Response post( Request request ) {
assertTrue("Expected a quote response", request.getBody(String.class).startsWith("quote:") );
return super.post( request );
}
}

@HttpTest( method = Method.GET, path = "/requestQuote" )
@Callback( port = 9090, path = "/asynchron", resource = TestCallbackResource.class, timeout = 10000 )
public void testMethod() {
assertAccepted( response );
}
}

Este último exemplo conecta-se ao requestQuote e monitora a porta 9090 do cliente. Durante até dez segundos, ele espera uma resposta textual, começando com “quote:”

Para mais informações sobre o Restfuse, visite a wiki do projeto e seu Javadocs. O código-fonte esta hospedado no GitHub.

Fonte: Kostis Kapelonis , traduzido por Jefferson Prestes /InfoQ

Tags | , , , , , , ,

23

nov
2011

Sem Comentários

Em Blog
JSON

Por Allison

JSON + Spring

Em 23, nov 2011 | Sem Comentários | Em Blog, JSON | Por Allison

É possível trabalhar com JSON e Spring. Você pode produzir dados em formato JSON dos controllers do framework, facilitando a manipulação da informação na página.

Mas como fazer isso?

Para isso, utilizamos a lib json-lib-ext-spring. Existem outras alternativas (biblioteca/lib), mas particularmente achei esse mais fácil e menos trabalhosa. Não esqueça de fazer o download da Json-lib e suas dependências.

Após o donwload e adição no buildPath do projeto, apenas é preciso fazer algumas pequenas modificações:

A primeira é acrescentar um arquivo chamado views.xml ao diretório do WEB-INF com o seguinte conteúdo:

O segundo é adicionar o conteúdo seguinte ao arquivo de configuração do Spring:

Lembre-se de setar uma ordem se você estiver utilizando algum outro view resolver.

Com essas alterações efetuadas, basta utilizar “jsonView” como o viewname e o model será convertido para json quando voltar para o cliente:

Fonte: Loiane Groner

Tags | , , ,

23

nov
2011

Sem Comentários

Em Blog
e-commerce
PHP

Por Allison

Como obter uma lista de categorias com ofertas e produtos relacionados usando o Wrapper PHP

Em 23, nov 2011 | Sem Comentários | Em Blog, e-commerce, PHP | Por Allison

É simples utilizar o Wrapper PHP para obter uma lista de categorias. Portanto, o objetivo agora é ter um resultado somente com as categorias, sem ofertas que não apresentem produtos relacionados (categorias com ofertas soltas).

Uma categoria que possui ofertas soltas é uma categoria que possui somente ofertas e não produtos, enquanto a que não possui ofertas soltas tem produtos relacionados a ela. Quando ocorre a primeira situação, somos impedidos de utilizar filtros e comparar os preços das ofertas, pois não temos produtos. Já no segundo momento, os produtos possuem filtros e podemos fazer configurações de preços.

Após instanciar a classe Apiki BuscaPé API e definir o ambiente de testes da API do BuscaPé (sandbox), vamos obter uma lista de categorias no formato json para um tratamento mais fácil dos dados:

require_once '../Apiki_Buscape_API.php';

$applicationId  = '564771466d477a4458664d3d';

$objApikiBuscapeApi = new Apiki_Buscape_API( $applicationId );

$objApikiBuscapeApi->setSandbox();

$objApikiBuscapeApi->setFormat( 'json' );

$categories = $objApikiBuscapeApi->findCategoryList( array( 'keyword' => 'celular' ) );

Usamos agora o método json_decode para transformar os dados obtidos em um objeto:

$categories = json_decode( $categories );

Tendo em mãos esse objeto, vamos dar um unset em todas as categorias que contenham ofertas soltas:

foreach (  $categories->subcategory as $key => $category )

if ( !$category->subcategory->hasoffer )
        unset( $categories->subcategory[$key] );

Teremos, assim, uma lista de categorias que possuam produtos.

Tenha mais informações sobre o Wrapper PHP em nossa documentação online.

Fonte: IMasters

Tags | , ,

23

nov
2011

Sem Comentários

Em Blog
NodeJs

Por Allison

NodeJS – análise e processamento de grandes documentos XML

Em 23, nov 2011 | Sem Comentários | Em Blog, NodeJs | Por Allison

Se você está trabalhando com dados legados, muitas vezes deve ter problemas com o tamanho dos dados. Um tempo atrás, eu tive que analisar grandes arquivos XML, extrair alguns dados, convertê-los, adicionar manualmente os dados gerados e então salvar o output em um arquivo JSON. (Precisamos disso porque mais tarde esse arquivo será usado como input para nosso componente ExtJS/Sencha).

Na minha máquina de desenvolvimento, o NodeJS já está instalado. Dê uma olhada no guia de instalação NodeJS, se você quiser instalá-lo. Agora você pode escrever programas executáveis em JavaScript baseados no mecanismo V8 do Google.

Eu fiz o download da SAX XML parser library para o NodeJS (escrita por isaacs). É bastante fácil incluí-la no meu espaço de trabalho, apenas adicione uma linha simples para incluir “sax.js”. O segundo componente de que preciso é o arquivo do sistema para ler o conteúdo do arquivo XML.

var fs = require('fs');
var sax = require('./sax');

A primeira coisa que você tem que fazer é criar uma nova instância do parser.

parser = sax.parser(strict);

O parser sozinho está trabalhando orientado a eventos, como quase tudo no NodeJS. Quando você está usando um parser orientado a eventos XML, é bastante útil usar um diagrama de estados – pois é mais fácil compreender o tipo de nó que você está visitando atualmente.

Agora existem alguns ganchos pré-definidos que você pode usar para escutar eventos como open tag, close tag etc…

parser.ontext = function(t) {
   console.log('This is the text in that node: ' + t);
};

parser.onopentag = function(node) {
   //on new tag opened
};

No final, a única coisa que você tem que fazer é iniciar o processo do parser. Apenas leia o conteúdo do arquivo em um String buffer (chamado file_buf) e então o coloque na biblioteca do parser.

try {
    var file_buf = fs.readFileSync('./demistified.xml');
    parser.write(file_buf.toString('utf8')).close();
} catch(ex) {
    // keep 'em silent
}

Nos ganchos do evento, você pode começar a escrever sua própria estrutura de dados, o NodeJS é construído para analisar e segurar muitos dados complexos. No meu caso, eu tinha um arquivo de 20 MB de dados XML, e eu extraí 180 nós de dados dessa imensa quantidade em apenas 2 segundos.

No final, se você precisar que sua estrutura interna de dados (provavelmente você usará array e combinações de objetos) seja salva em um arquivo, você pode facilmente utilizar o comando:

fs.writeFileSync('test.json', JSON.stringify(DataNodeSpace));

Ele escreve o array DataNodeSpace no formato JSON no arquivo test.json.

Para modificar, atravessar, adicionar propriedades a um array ou objeto no JavaScript ou no NodeJS, é bastante fácil e rápido. Eu fiquei maravilhado com a rapidez com que você pode construir um parser XML (10 linhas de código) e depois da (mais ou menos complexos *g*) execução dos algoritmos de análise você pode transformar os elementos de dados fácil e confortavelmente.

Espero que você tenha tido uma pequena visão geral sobre como analisar arquivos XML no NodeJS.

Texto original disponível em http://blog.lagentz.com/nodejs/nodejs-parsing-and-transforming-large-xml-documents/

Fonte: IMasters

Tags | , , ,

12

nov
2011

Sem Comentários

Em Blog

Por Allison

Utilizando JSON em projetos iBOLT e uniPaaS

Em 12, nov 2011 | Sem Comentários | Em Blog | Por Allison

O padrão de notação JSON (“JavaScript Object Notation” http://en.wikipedia.org/wiki/JSON) tem sido bastante utilizado na troca de informações entre aplicações WEB atualmente, isto porque existem alguns ganhos como quantidade de bytes se comparado com XML (http://en.wikipedia.org/wiki/JSON#Comparison_with_other_formats) e o fato de não ser necessário a utilização de parse mais apurado como XML.

Como em nossa tecnologia (iBOLT e uniPaaS) existe a grande facilidade de trabalhar com XML, que tal convertermos JSON para XML? A idéia deste post é se utilizar de um componente JAVA já desenvolvido para o tratamento de JSON e incluir em nossa solução um componente reutilizável para iBOLT e invocar este código JAVA no uniPaaS.

As referências do nosso post são:

1) http://json.org: Descrição de toda notação JSON

2) http://json.org/java/: Código Java que iremos utilizar em nossa solução iBOLT e uniPaaS

3) http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html: Como compilar o código extraído do item 2

4) http://download.oracle.com/javase/6/docs/technotes/tools/windows/jar.html: Como gerar o arquivo .jar para ser incluído na biblioteca do iBOLT e uniPaaS

5) http://devnet.magicsoftware.com/en/library?book=en/uniPaaS/&page=Java_Integration/Type_Signatures.htm: Como saber a assinatura de um objeto JAVA para ser utilizado em uniPaaS.

Preparando nossa biblioteca escrita em JAVA

Faça o download do código fonte que está no item 2 da nossa referência. Neste exemplo colocarei na pasta C:\POST, para seguir a estrutura do JAVA. Como o código foi desenvolvido dentro de um pacote org.json, coloque os arquivos dentro de uma estrutura de pasta org\json, então coloque todos os arquivos no caminho C:\POST\org\json. Veja como ficou nossa estrutura:

Para facilitar o nosso teste no iBOLT e uniPaaS, vamos criar um novo código JAVA, este código fará a conversão do objeto JSON em XML e vice-versa.

Crie um novo arquivo chamado Conversor.java e inclua o seguinte código:

Agora vamos compilar todos estes arquivos *.java, executando simplesmente o comando javac *.java, veja como foi o resultado:

Agora vamos juntar todos os *.class em um único pacote, basta ir para a pasta C:\POST e rodar o comando jar -cvf json.jar org\json\*.class, veja como foi o resultado:

Pronto na pasta C:\POST foi gerado o arquivo json.jar que vamos utilizar no iBOLT e uniPaaS.

Utilizando em iBOLT

Como o iBOLT tem a possibilidade de expandir a capacidade de sua lista de componentes, utilizando o item componente SDK (http://devnet.magicsoftware.com/en/library?book=en/iBOLT/&page=Component_SDK.htm) vamos incluir um novo componente que será capaz de converter um formato JSON para XML e ao contrário.

Pegue o arquivo json.jar gerado no item anterior e coloque na pasta <ibolt_home>\java\lib.

Acesse o menu Tools / Component SDK e clique em New. Coloque as seguintes informações na tela:

Repare que o tipo é Java, e para ficar mais interessante copiei a imagem de http://json.org/img/json160.gif para <ibolt_home>icons\jsonifc.gif.

Clique em Methods e digite org.json.Conversor no campo class name, ao teclar tab aparecerão os métodos. Selecione somente os métodos toXML e toJSON. Veja:

Após clicar em load abrirá uma tela para melhorar a forma de configurar o nosso componente, neste passo é interessante colocar nomes amigáveis em Display Name, neste sentido vamos fazer as seguintes alterações:

No método toJSON, no parâmetro P1 colocar o display name para XML e no parâmetro P_Return colocar o display name para JSON. Em ambos os parâmetros altere o campo Picture para 32000.

No método toXML, no parâmetro P1 colocar o display name para JSON e no parâmetro P_Return colocar o display name para XML. Em ambos os parâmetros altere o campo Picture para 32000.

Clique em OK.

Para gerar o nosso componente e ser possível sua utilização clique em Generate e depois OK e pode fechar a tela atual.

O componente definido nos passos anteriores fica gravado na pasta <ibolt_home>\User resources\Components onde cada pasta significa um componente definido na tela do Componente SDK.

Sempre que precisar utilizar nos projetos o componente colocado no componente SDK você deve acionar o menu Project / Component clicando no botão Add.

Agora já temos um novo componente na lista de componente do iBOLT. Veja:

Agora podemos configurar os métodos, veja:

Observações que devem ser sempre seguidas em ambiente desenvolvimento e produção que utilizarem o componente em questão:

1) O arquivo json.jar deve estar sempre no caminho <ibolt_home>\java\lib

2) O componente SDK deve estar sempre na pasta <ibolt_home>\User resources\Components

Utilizando em uniPaaS

Para o uniPaaS carregar o arquivo json.jar criado anteriormente teremos que acrescentar no magic.ini na seção [MAGIC_JAVA] na configuração CLASSPATH o local onde o uniPaaS poderá encontrar o arquivo json.jar. Neste sentido iremos disponibilizar o arquivo json.jar em uma pasta na própria instalação do uniPaaS no local C:\MSE\uniPaaS1.9h\json por exemplo, veja:

Precisamos alterar no magic.ini na seção [MAGIC_JAVA] na configuração CLASSPATH informando o arquivo json.jar. Veja:

Agora vamos fazer o programa que invoca o código JAVA, imaginando que tivéssemos uma tela desta forma:

A referência da variável JSON é igual a “A” e a referência da variável XML é igual “B”. Basta utilizar a função JCallStatic. Nesta função precisamos passar o nome da classe e método, assinatura e parâmetros. No nosso caso as informações são:

Nome da classe = org.json.Conversor.toXML

Assinatura = (Ljava/lang/String;)Ljava/lang/String; esta informação foi obtida utilizando a nossa referência do item 5.

O parâmetro = JSON que neste caso é a variável A.

Veja como fica nossa expressão:

A expressão acima está sendo utilizada em um update. Veja:

Executando e testando, veja que o objeto JSON é convertido em XML:

CONCLUSÃO

Com a implementação de uma nova funcionalidade em nossa ferramenta, colocamos em prática a possibilidade de interoperabilidade e aumento da capacidade em nossa ferramenta iBOLT e uniPaaS. Com isso, em um exemplo bem prático e simples colocamos a prova de como são simples e poderosas as nossas ferramentas.

Espero que este post tenha ajudado a enxergar no iBOLT e uniPaaS as ferramentas poderosas e versáteis que temos em nossas mãos.

Fonte: Jeronimo Costa/MagicSoftware

Tags | , , , , ,

17

set
2011

Sem Comentários

Em Blog

Por Allison

Um olhar sobre alguns bancos de dados NoSQL

Em 17, set 2011 | Sem Comentários | Em Blog | Por Allison

Em um artigo anterior, falei sobre o NoSQL e algumas ferramentas para serem usadas com ele. Neste artigo, daremos uma olhada no MongoDB, no Redis e no Riak.

MongoDB

O MongoDB combina o melhor dos armazenamentos chave-valor, documentos de bancos de dados, bancos de dados (ou database?) de objeto e sistemas de gerenciamento de bancos de dados relacionais (RDBMS). Isso significa que o MogoDB executa o sharding automaticamente (como com armazenamentos chave-valor), permite documentos de schema dinâmicos baseados em JSON, e oferece uma rica linguagem de query na forma de RDBMS. Além disso, o MongoDB oferece auto-sharding (o sharding de dados novos e pré-existentes é feito automaticamente) e um recurso de implementação MapReduce. Dê uma olhada mais de perto no cluster MongoDB, e você verá que ele é feito de vários tipos de servidores:

  • Servidores shard que armazenam dados
  • Servidores de configuração que armazenam a configuração
  • Servidores router que recebem e roteiam as solicitações
  • Uma thread de servidor usando MapReduce

Alguns fatos adicionais sobre MongoDB: é uma ferramenta de armazenagem distribuída orientada a documentos e usa a linguagem de implementação C++. Com o progresso do schema, documentos do tipo JSON são armazenados, e schemas dinâmicos podem ser usados. Entre as companhias que usam o MongoDB encontramos: Shutterfly, Evite e The New York Times. Impressionante! Uma das coisas bacanas das quais gosto a respeito desse produto é a existência de uma interface web bastante boa, que permite testar o MongoDB em seu browser – mas usando uma shell JavaScript.

Redis

O Redis não é um simples armazenamento chave-valor, porque suporta uma variedade de valores em diferentes estruturas de dados, tais como listas e conjuntos de binary-safe strings, bem como conjuntos ordenados, que contêm uma pontuação de números float. No ano passado, o VMWare se tornou patrocinador do Redis. Ele possui uma orientação chave-valor, e sua linguagem de implementação é ANSI C. Entretanto, o Redis não é distribuído. Sob seu schema, Redis oferece um armazenamento chave-valor, usando um nome-chave de servidor para armazenar e recuperar valores. Como MongoDB, o Redis tem uma lista impressionante de clientes – incluindo Python, Twisted Python e a nova linguagem do Google, Go. O Redis é open source, e há uma página muito bacana que oferece um tutorial Redis que permite experimentá-lo diretamente de seu browser usando JavaScript. Descubra-a em http://try.redis-db.com.

Basho Riak

Riak é um banco de dados híbrido fabricado pela BashoTecnologies, mas é baseado no Amazon Dynamo. Funciona como um banco de dados (tradução de database?) orientado para documentos, e também com um armazenamento chave-valor distribuído. É tolerante a falhas e faz escalas linearmente. É direcionado para uso em aplicativos web. Como o Cassandra, não tem um controlador central, e assim não tem um ponto único de falhas. O Riak é um armazenamento de chaves/valor plenamente distribuído, e implementa o MapReduce. O design do Riak inclui três elementos básicos: buckets, chaves e valores. Os dados são organizados em buckets, que são pouco mais do que flat namespaces para agrupar logicamente pares chave/valor. Os buckets podem armazenar os dados diretamente ou através de links para outro bucket. Todos os nós no cluster têm o mesmo papel. O sharding de dados (existentes ou novos) é feito automaticamente entre os nós. O Riak vem tanto em versão comercial quanto em versão open source. Roda em Unix, mas não em sistemas Windows. Ele é distribuído, um sistema tanto de documento quanto de armazenamento chave-valor, e sua linguagem de implementação é Erland, juntamente como alguma coisa de C e de JavaScript. O Riak tem uma estrutura simples e não usa tipos de dados específicos. Os valores associados às chaves são objetos. O Riak interage com clientes via JSON sobre a interface HTTP; tem drivers para Erlang, Python, Java, PHP, JavaScript e Ruby; e, finalmente, uma interface de cliente que suporta o Protocol Buffers, do Google. A base de clientes do Riak inclui a Comcast.

Texto original disponível em: http://blog.monitis.com/index.php/2011/06/06/a-look-at-some-nosql-databases-mongodb-redis-and-basho-riak/

Fonte: Mikayel Vardanyan/Imaster

Tags | , , , , , , , , ,