BT

JSON-P: A API padrão para processamento de JSON em Java

por Bienvenido David III , traduzido por Marcelo Cenerino em 07 Jun 2013 |

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.

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.