A JSR 353, que trata da API para processamento de JSON em Java (JSON-P), atingiu o estágio de votação final no mês de abril. O JSON-P (similar ao JAXP) consiste em uma API de streaming (similar ao StAX) e uma API de modelo de objetos (similar ao DOM). A implementação de referência, denominada jsonp, atualmente está em fase beta e é open source sob a licença CDDL v1.1 e GPL v2. O JSON-P será parte do Java EE 7 e utilizado pela API JAX-RS como sua implementação padrão para JSON. Observe que a API não inclui a funcionalidade de data binding (similar ao JAXB), e não é relacionada ao popular JSONP ou "JSON with padding".
O JSON (JavaScript Object Notation) é um formato leve para troca de dados e é utilizado em aplicações Web, serviços REST e bancos de dados NoSQL. Com a popularidade do formato JSON e a existência de várias bibliotecas JSON para a plataforma Java (org.json, Jackson, google-gson, etc.), existe a necessidade de padronizar como os desenvolvedores criam e consomem JSON. O JSON-P é o futuro padrão e pode ser usado de forma independente ou como parte de containers Java EE 7.
O JSON-P é dividido em duas APIs: a API de streaming (javax.json.stream) e a API de modelo de objetos (javax.json). A API de streaming (Streaming API) fornece uma maneira eficiente e de baixo nível para fazer parsing e gerar JSON. Ela consiste de duas abstrações básicas: JsonParser e JsonGenerator. A interface JsonParser é um pull parser que fornece acesso de leitura em uma fonte de entrada em formato JSON. JsonGenerator fornece métodos para escrever JSON para um stream e também possibilita o encadeamento de chamadas de métodos. O gerador escreve pares de nome/valor em objetos JSON e valores em arrays JSON.
A seguir serão apresentados alguns exemplos de código que mostram o uso das interfaces JsonParser e JsonGenerator. O primeiro trecho mostra o dado em formato JSON que será lido ou criado pela API nos demais exemplos.
[
{
"type" : "home",
"number" : "(800) 111-1111"
},
{
"type" : "cell",
"number" : "(800) 222-2222"
}
]
O exemplo a seguir mostra o uso da interface JsonParser e sua saída no final.
JsonParserFactory factory = Json.createParserFactory(null);
JsonParser parser = factory.createParser(new StringReader(json));
while (parser.hasNext()) {
Event event = parser.next();
switch (event) {
case KEY_NAME: {
System.out.print(parser.getString() + "="); break;
}
case VALUE_STRING: {
System.out.println(parser.getString()); break;
}
}
}
type=home
number=(800) 111-1111
type=cell
number=(800) 222-2222
A seguir, temos o exemplo com JsonGenerator, o qual imprime o objeto JSON no System.out.
JsonGeneratorFactory factory = Json.createGeneratorFactory(null);
JsonGenerator generator = factory.createGenerator(System.out);
generator.writeStartArray().
writeStartObject().
write("type", "home").
write("number", "(800) 111-1111").writeEnd().
writeStartObject().
write("type", "cell").
write("number", "(800) 222-2222").writeEnd().
writeEnd().close();
A API de modelo de objetos (Object Model API) é uma API de alto nível, simples e fácil de usar e implementada no topo da API de streaming. Ela cria uma estrutura em árvore para representar o objeto JSON em memória, o qual pode ser facilmente navegado e consultado. As abstrações básicas na API são: JsonObject e JsonArray, ambas imutáveis. A interface JsonObject fornece uma visão em mapa (Map) para acessar a coleção não-ordenada de pares nome/valor no modelo. A interface JsonArray fornece uma visão em lista (List) para acessar a sequência ordenada de valores. Para criar esses objetos de modelo, pode-se utilizar o padrão builder (JsonObjectBuilder e JsonArrayBuilder) ou fazer leitura a partir de uma fonte de entrada (InputStream ou Reader) usando a interface JsonReader. Os modelos de objetos podem ser escritos para um stream de saída (OutputStream ou Writer) usando a interface JsonWriter.
Abaixo, segue um exemplo de criação de JsonArray usando JsonArrayBuilder. Apenas para lembrar, estamos trabalhando com o dado em formato JSON mostrado inicialmente.
JsonBuilderFactory factory = Json.createBuilderFactory(null);
JsonArray jsonArray = factory.createArrayBuilder()
.add(factory.createObjectBuilder().
add("type", "home").
add("number", "(800) 111-1111"))
.add(factory.createObjectBuilder().
add("type", "cell").
add("number", "(800) 222-2222")).build();
Agora, um exemplo usando o JsonReader.
try (JsonReader jsonReader = Json.createReader(new StringReader(json))) {
JsonArray array = jsonReader.readArray();
System.out.println(array);
}
A seguir, um exemplo usando JsonWriter.
try (JsonWriter jsonWriter = Json.createWriter(System.out)) {
jsonWriter.writeArray(jsonArray);
}
Para experimentar a versão beta da API, baixe o jsonp ou utilize os artefatos Maven javax.json:javax.json-api:1.0-b06 e org.glassfish:javax.json:1.0-b06. É necessário instalar o Java SE 6 ou superior. Para mais informações, visite o site official da API JSON-P e leia os Javadocs. Há também um vídeo disponível no YouTube mostrando a apresentação da API JSON-P no JavaOne.