Back-End

1 out, 2014

Escrevendo JSON de forma simples em Perl com o módulo WJSON

Publicidade

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"
    }
}

Referências: