Como eu uso muito JSON, resolvi desenvolver o módulo WJSON para facilitar meu trabalho no meu dia-a-dia. Existem módulos excelentes no CPAN para criar JSON, mas que não são ideias para criar JSON complexos, pois demandam que o programador tenha um bom conhecimento em manipulação de hashref e arrayref e concatenação de referência. Com o módulo WJSON, essa dificuldade de criar JSON complexos é eliminada, porque sua sintaxe é muito simples, que facilita a criação e manutenção do JSON.
Instalação
Primeiro instale o módulo App::cpanminus
$ cpan App::cpanminus
Depois de instale o módulo WJSON
$ cpanm WJSON
O módulo tem dependências dos módulos Moose, JSON, Encode e Tie::IxHash.
Atributos
encoding: com esse atributo você seta o encoding do json, se não setar nenhum valor o padrão é utf-8
my $wjson = new WJSON(encoding => 'iso-8859-1');
ou
my $wjson = new WJSON; $wjson->encoding('iso-8859-1');
variable: com esse atributo você seta um nome para uma variável quer retornará com JSON
my $wjson = new WJSON(variable => 'json');
ou
my $wjson = new WJSON; $wjson->variable('json');
ordering: com esse atributo você pode ordenar o JSON, lembrando que hash em Perl não é ordenado, se ordenar seu JSON dependendo do tamanho pode perder um pouco de desempenho
my $wjson = new WJSON(ordering => 1);
ou
my $wjson = new WJSON; $wjson->ordering(1);
Métodos
Open: abre um object ou array, você precisa setar um nome
$wjson->Open('Foo');
Close: fecha um object ou array, trabalha em conjunto com o método Open. Setar 1 separa da referência atual, setar 2 adicionar o valor dentro de um array, setar 3 é os dois juntos
$wjson->Close();
ou
$wjson->Close();
Object: cria objects, precisa setar índices e valores
$wjson->Object( indice1 => valor1, indice2 => valor2, indice2 => valor3 );
ou
$wjson->Object( { indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', }, { indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', } );
Array: cria arrays, precisa setar os valores
$wjson->Array('valor1', 'valor2', 'valor3');
ou
$wjson->Array('valor1'); $wjson->Array('valor2'); $wjson->Array('valor3');
ou
$wjson->Array(['valor1', 'valor2', 'valor3'], ['valor4', 'valor5', 'valor6']);
Header: retorna o cabeçalho para JSON
return "application/json";
HeaderJS: retorna o cabeçalho para JavaScript
return "application/javascript";
HeaderCGI: retorna o cabeçalho para JSON em CGI
return "Content-type: application/json\n\n";
HeaderJSCGI: retorna o cabeçalho para JavaScript em CGI
return "Content-type: application/javascript\n\n";
Print: retorna o JSON
Exemplos
Exemplo 1
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON(encoding => 'iso-8859-1'); $wjson->Array('valor1', 'valor_2', 'valor3'); print $wjson->HeaderCGI; print $wjson->Print;
retornara:
["valor1","valor2","valor3"]
Exemplo 2
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON(); $wjson->Object( indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', ); print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{"indice1":"valor1","indice3":"valor3","indice2":"valor2"}
Exemplo 3
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Array( ['A', 'B', 'C', 'D', 'E'], [1, 2, 3, 4, 5] ); print $wjson->HeaderCGI; print $wjson->Print;
retornara:
[ ["A","B","C","D","E"], [1,2,3,4,5] ]
Exemplo 4
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Object( { indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', }, { indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', } ); print $wjson->HeaderCGI; print $wjson->Print;
retornara:
[ {"indice1":"valor1","indice3":"valor3","indice2":"valor2"}, {"indice6":"valor6","indice5":"valor5","indice4":"valor4"} ]
Exemplo 5
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Object( { indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', }, { indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', } ); $wjson->Open('Foo'); $wjson->Array(1, 2, 3, 4, 5); $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
[ {"indice1":"valor1","indice3":"valor3","indice2":"valor2"}, { "indice6":"valor6", "indice5":"valor5", "Foo":[1,2,3,4,5], "indice4":"valor4" } ]
Com uma pequena mudança no código acima, setando um valor em Close:
$wjson->Close(1);
retornará:
[ {"indice1":"valor1","indice3":"valor3","indice2":"valor2"}, {"indice6":"valor6","indice5":"valor5","indice4":"valor4"}, {"Foo":[1,2,3,4,5]} ]
Exemplo 6
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Open('Baz'); $wjson->Object( indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', ); $wjson->Open('Foo'); $wjson->Object( indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', ); $wjson->Open('Bar'); $wjson->Object( indice7 => 'valor7', indice8 => 'valor8', indice9 => 'valor9', ); $wjson->Close; $wjson->Close; $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{ "Baz": { "indice1": "valor1", "indice3": "valor3", "Foo": { "indice6": "valor6", "Bar": { "indice7": "valor7", "indice8": "valor8", "indice9": "valor9" }, "indice5": "valor5", "indice4": "valor4" }, "indice2": "valor2" } }
Exemplo 7
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Open('Baz'); $wjson->Object( indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', ); $wjson->Open('Foo'); $wjson->Object( indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', ); $wjson->Open('Bar'); $wjson->Object( indice7 => 'valor7', indice8 => 'valor8', indice9 => 'valor9', ); $wjson->Close(1); $wjson->Close(1); $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{ "Baz": [{ "indice1": "valor1", "indice3": "valor3", "indice2": "valor2" }, { "Foo": [{ "indice6": "valor6", "indice5": "valor5", "indice4": "valor4" }, { "Bar": { "indice7": "valor7", "indice8": "valor8", "indice9": "valor9" } }] }] }
Exemplo 8
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Open('Baz'); $wjson->Object( indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', ); $wjson->Object( indice4 => 'valor4', indice5 => 'valor5', indice6 => 'valor6', ); $wjson->Object( indice7 => 'valor7', indice8 => 'valor8', indice9 => 'valor9', ); $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{ "Baz": [{ "indice1": "valor1", "indice3": "valor3", "indice2": "valor2" }, { "indice6": "valor6", "indice5": "valor5", "indice4": "valor4" }, { "indice7": "valor7", "indice8": "valor8", "indice9": "valor9" }] }
Exemplo 9
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Array(1,2,3,4,5); $wjson->Array(6,7,8,9,10); $wjson->Array('A','B','C','D','E'); $wjson->Array('F','G','H','I','J'); print $wjson->HeaderCGI; print $wjson->Print;
retornara:
[ [1, 2, 3, 4, 5], [6, 7, 8, 9, 10], ["A", "B", "C", "D", "E"], ["F", "G", "H", "I", "J"] ]
Exemplo 10
Usando variável javascript como referência do JSON
Perl:
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->variable('json'); $wjson->Object( indice1 => 'valor1', indice2 => 'valor2', indice3 => 'valor3', ); print $wjson->HeaderJSCGI; print $wjson->Print;
HTML, mude o nome do “exemplo10.pl” para o nome do arquivo que você colocou no código acima
<!DOCTYPE html> <html> <head> <title>Exemplo 10</title> <script src="exemplo10.pl"></script> <script> window.onload = function(){ alert('indice1: ' + json.indice1); alert('indice2: ' + json.indice2); alert('indice3: ' + json.indice3); }; </script> </head> <body> </body> </html>
Exemplo 11
Primeiro exemplo do site http://json.org/example
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Open('glossary'); $wjson->Object( title => 'example glossary' ); $wjson->Open('GlossDiv'); $wjson->Object( title => 'S' ); $wjson->Open('GlossList'); $wjson->Object( GlossSee => 'markup' ); $wjson->Open('GlossEntry'); $wjson->Object( ID => 'SGML', SortAs => 'SGML', GlossTerm => 'Standard Generalized Markup Language', Acronym => 'SGML', Abbrev => 'ISO 8879:1986', ); $wjson->Open('GlossDef'); $wjson->Object( para => 'A meta-markup language, used to create markup languages such as DocBook.' ); $wjson->Open('GlossSeeAlso'); $wjson->Array('GML', 'XML'); $wjson->Close; $wjson->Close; $wjson->Close; $wjson->Close; $wjson->Close; $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{ "glossary": { "GlossDiv": { "GlossList": { "GlossEntry": { "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossTerm": "Standard Generalized Markup Language", "ID": "SGML", "SortAs": "SGML", "Acronym": "SGML", "Abbrev": "ISO 8879:1986" }, "GlossSee": "markup" }, "title": "S" }, "title": "example glossary" } }
Exemplo 12
Segundo exemplo do site http://json.org/example
#!/usr/bin/perl use strict; use warnings; use WJSON; my $wjson = new WJSON; $wjson->Open('menu'); $wjson->Object( id => 'file', value => 'File', ); $wjson->Open('popup'); $wjson->Open('menuitem'); $wjson->Object( { value => 'New', onclick => 'CreateNewDoc()' }, { value => 'Open', onclick => 'OpenDoc()' }, { value => 'Close', onclick => 'CloseDoc()' } ); $wjson->Close; $wjson->Close; $wjson->Close; print $wjson->HeaderCGI; print $wjson->Print;
retornara:
{ "menu": { "value": "File", "popup": { "menuitem": [{ "value": "New", "onclick": "CreateNewDoc()" }, { "value": "Open", "onclick": "OpenDoc()" }, { "value": "Close", "onclick": "CloseDoc()" }] }, "id": "file" } }