Visão geral do JSON Pointer
1. Overview
Neste tutorial,we’ll show how to use JSON Pointer to navigate and fetch information from JSON data.
Também mostraremos como realizar operações, como inserir novos dados ou atualizar valores-chave existentes.
2. Configuração de Dependência
Primeiro, precisamos adicionar algumas dependências ao nossopom.xml:
org.glassfish
javax.json
1.1.2
3. Ponteiro JSON
JSON (“JavaScript Object Notation”) é um formato leve para troca de dados entre sistemas, originalmente especificado por Douglas Crockford.
Embora use a sintaxeJavaScript,it’s language-independent, since the resultant is plain text.
Ponteiro JSON (RFC 6901) é um recurso da API JSON Processing 1.1 (JSR 374). Ele define umString que pode ser usado para acessar valores em um documento JSON. Pode estar relacionado ao que XPath faz para um documento XML.
Através do uso do JSON Pointer, podemos buscar dados e alterar um arquivo JSON.
4. Acessando Dados
Veremos alguns exemplos de como realizar operações implementando uma classe chamadaJsonPointerCrud.
Suponhamos que temos um arquivo JSON chamadobooks.json com o conteúdo:
{
"library": "My Personal Library",
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}
Para acessar os dados desse arquivo, precisamos lê-lo e analisá-lo emJsonStructure. Podemos alcançá-lo usando o métodoJson.createReader(), que aceitaInputStream ouFileReader.
Veja como podemos fazer isso:
JsonReader reader = Json.createReader(new FileReader("books.json"));
JsonStructure jsonStructure = reader.read();
reader.close();
O conteúdo será armazenado em um objetoJsonStructure. Este é o objeto que usaremos para realizar as próximas operações.
4.1. Buscar dados do arquivo
Para buscar um único valor, criamos umJsonPointer, informando de qual tag queremos obter o valor:
JsonPointer jsonPointer = Json.createPointer("/library");
JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
System.out.println(jsonString.getString());
Observe quethe first character of thisStringis a ‘/' * - este é um requisito sintático *.
O resultado desse snippet é:
My Personal Library
Para buscar um valor de uma lista, precisamos especificar seu índice (onde o primeiro índice é 0):
JsonPointer jsonPointer = Json.createPointer("/books/1");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());
Isso gera:
"title":"Title 2", "author":"John Doe"
4.2. Verifique se uma chave está presente no arquivo
Através do métodocontainsValue, podemos verificar se o valor usado para criar o ponteiro está presente no arquivo JSON:
JsonPointer jsonPointer = Json.createPointer("/library");
boolean found = jsonPointer.containsValue(jsonStructure);
System.out.println(found);
O resultado para este snippet é:
true
4.3. Inserir novo valor-chave
Se precisarmos adicionar um novo valor ao JSON, ocreateValue é quem vai lidar com isso. The method createValue is overloaded to accept String, int, long, double, BigDecimal and BigInteger:
JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumber = Json.createValue(2);
jsonStructure = jsonPointer.add(jsonStructure, jsonNumber);
System.out.println(jsonStructure);
Novamente, nossa saída é:
{
"library": "My Personal Library",
"total": 2,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}
4.4. Atualizar um valor-chave
To update a value we need to create the new value first. Depois que o valor é criado, usamos o métodoreplace do ponteiro criado usando o parâmetro chave:
JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumberNewValue = Json.createValue(5);
jsonStructure = jsonPointer.replace(jsonStructure, jsonNumberNewValue);
System.out.println(jsonStructure);
Saída:
{
"library": "My Personal Library",
"total": 5,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}
4.5. Remover uma chave
Para remover uma chave, primeiro criamos um ponteiro para a chave. Em seguida, usamos o método remove:
JsonPointer jsonPointer = Json.createPointer("/library");
jsonPointer.getValue(jsonStructure);
jsonStructure = jsonPointer.remove(jsonStructure);
System.out.println(jsonStructure);
Resultando em:
{
"total": 5,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}
4.6. Mostrar o conteúdo completo do arquivo
Se o ponteiro for criado com umString vazio, todo o conteúdo será recuperado:
JsonPointer jsonPointer = Json.createPointer("");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());
Este exemplo de código produziria todo o conteúdo dejsonStructure.
5. Conclusão
Neste artigo rápido, abordamos como trabalhar com o JSON Pointer para executar várias operações nos dados JSON.
E, como de costume, o código relacionado a este tutorial éover on GitHub.