Recentemente, eu fiz uma classe para tratar arquivos JSON. A classe tem os métodos de adicionar, remover, procurar e alterar, mas em todos os casos, na minha lógica, foi necessário passar o arquivo para um JsonArray e depois para um JsonObject.
Minha dúvida é a seguinte, é possível acessar um JsonObject sem passar o arquivo inteiro para um JsonArray?
A CLASSE:
package Default;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JOptionPane;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class Json
{
@SuppressWarnings("unchecked")
//>> O metodo include_Record adiciona um objeto ao arquivo JSON.
//>> data -> representa o endereco do arquivo JSON.
//>> obj -> representa o objeto a ser adicionado no arquivo.
//>> retorno -> o retorno da funcao é true quando o obj é adicionado ou false quando algum erro acontece.
public static boolean include_Record(String data,JSONObject obj)
{
try
{
FileReader fileReader = new FileReader(data); //leitor
JSONParser parser= new JSONParser(); // analisador
JSONArray jsonArray = (JSONArray) parser.parse(fileReader); // array do tipo jsonaray que guarda os valores do json.
fileReader.close(); // fechamento do metodo reader.
jsonArray.add(obj); //adicao do obj passado.
FileWriter fileWriter = new FileWriter(data); //metodo escritor.
fileWriter.write(jsonArray.toJSONString()); // gravacao do novo array no arquivo.
fileWriter.close(); // fechamento do metodo Writer.
return true;
}
catch (IOException | ParseException e)
{
JOptionPane.showMessageDialog(null,"Erro na adicao de registro. Erro: "+e);
return false;
}
}
//>> O metodo delete_Record deleta um objeto do arquivo JSON.
//>> file -> endereco do arquivo JSON.
//>> key -> key vai ser usada para acessar o campo de comparacao em cada obj.
//>> value -> value é o valor que esta contido dentro da key e servirá para localizar o obj que vai ser deletado.
//>> retorno -> o retorno é true quando o obj é deletado e false quando ele nao é encrontrado ou caso ocorra algum erro.
public static boolean delete_Record(String file, String key, String value)
{
try
{
FileReader fileReader = new FileReader(file);
JSONParser parser = new JSONParser();
JSONArray array = (JSONArray) parser.parse(fileReader);
fileReader.close();
for (int i = 0; i < array.size(); i++) // Varredor do Array
{
JSONObject object = new JSONObject(); // obj que armazena, temporariamente, cada obj do array.
object = (JSONObject) array.get(i);
if (object.get(key).equals(value)) // comparacao do valor passado como parametro e do valor do obj analizado
{
array.remove(i); // remocao do obj que atende a condicao do if
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(array.toJSONString()); // gravacao do array alterado
fileWriter.close();
return true;
}
}
}
catch (IOException | ParseException e)
{
JOptionPane.showMessageDialog(null,"Erro na exclusão de registro Erro: "+e);
return false;
}
return false;
}
//>> O metodo search_Record procura um obj no arquivo JSON.
//>> file -> endereco do arquivo JSON.
//>> key -> chave do campo que vai ser comparado.
//>> value -> campo que vai ser comparado.
//>> retorno -> retorna um JSNObject e null quando o obj nao é encontrado ou caso ocorra algum erro.
public static JSONObject search_Record(String file,String key,String value)
{
try
{
FileReader fileReader = new FileReader("data.json");
JSONParser parser= new JSONParser();
JSONArray jsonArray = (JSONArray) parser.parse(fileReader);
fileReader.close();
JSONObject jsonObject = new JSONObject();
for (int i = 0; i < jsonArray.size(); i++) // varredor
{
jsonObject = (JSONObject) jsonArray.get(i); //armazena o obj que vai ser comparado
if (jsonObject.get(key).equals(value))// compara o valor que esta contido no campo key com o passado como parametro.
{
return jsonObject; // retorno do obj que atende o if.
}
}
fileReader.close();
jsonArray = null;
jsonObject = null;
}
catch (Exception e)
{
System.out.println(e);
return null;
}
return null;
}
}