Dúvida sobre a manipulação de json

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

}

Em tese é preciso passar o arquivo inteiro para ser parseado.
se sua estrutura começa com Array e dentro dela tem os JSONObjeto tipo assim
[
{“nome”: “fulano” },
{“nome”, “cicrano” }

]

Tem que primeiro obter a Array e atraves dela trazer os JSONObject (s)

No seu exemplo voce usa um metodo static search_Record e a cada consulta esta lendo o arquivo “data.json”, e isso realmente não é performatico.

O ideal é ler o arquivo apenas 1 vez e consulta-lo “N” vezes sem usar static, agora se o arquivo fica toda hora sendo alterado, então não tem jeito, tem que ser da forma que você fez mesmo.

Tem casos em que JSON não é a melhor opção.

É preciso ver certo o que voce de fato pretende e se atende o desejado.

Entendi…

Minha ideia inicial era, acima de tudo, aprender a mexer com JSON em java e como bônus usar o JSON como banco de dados, mas o projeto acabou ficando mais complicado ai decidi ir para o mais certo, que é o MySQL.

Muito obrigado pela orientação. :+1:

1 curtida