C# - Realizando operações CRUD em arquivos JSON


  Hoje veremos realizar operações CRUD em arquivos JSON usando a linguagem C#.

Na linguagem C#  podemos  usar a biblioteca .NET que inclui os recursos para serializar e deserializar JSON no assembly System.Web.Extensions.

Neste artigo vamos usar os recursos existentes nesse assembly para ler e excrever no formato JSON.

o JSON [JavaScript Object Notation] é um subconjunto de JavaScript e é um formato de troca de dados muito leve. Dependendo do cenário podemos até usar esse tipo de armazenamento em um projeto de onde podemos acessar os dados muito rapidamente. 

Nessa abordagem não queremos criar uma conexão e verificar a disponibilidade da conexão, e não queremos depender de outro servidor, pois isso é demorado.

Por exemplo, se um projeto não tiver conectividade de banco de dados e quiser armazenar informações de usuário, usando essa abordagem podemos usar um arquivo JSON para armazenar esses dados.

Portanto, neste artigo veremos uma forma de implementar tal abordagem executando operações CRUD em arquivos JSON e usar arquivos JSON como um banco de dados.

A título de exemplo vamos usar um arquivo no formato JSON chamado usuario.json com o seguinte código:

    { 
      "id": 123, 
      "nome": "Jose Carlos Macoratti", 
      "endereco": { 
        "rua": "Rua Mirassol, 100", 
        "cidade": "Campinas", 
        "cep": 13095014 
      }, 
      "experiencias": [ 
        { 
          "empresaid": 22, 
          "empresanome": "Microsoft" 
        }, 
        { 
          "empesaid": 54, 
          "empersanamo": "JcmSoft" 
        }, 
        { 
          "empresaid": 67, 
          "empresanome": "IncSoft" 
        } 
      ], 
      "telefone": 123464422, 
      "cargo": "Desenvolvedor C#" 
    }  

Acessando o site jsoneditoronline.org podemos ter uma visualização melhor da estrutura do arquivo:

Este arquivo possui informação de usuário como :  id, nome, endereço, experiências, etc.

A seguir vamos criar uma aplicação Console e realizar as operações CRUD neste arquivo.

Criando o  projeto no VS 2017 Community

Usando o Visual Studio 2017 Community no menu File clique em New Project;

A seguir selecione Visual C# -> Windows Desktop;

Selecione o template Console App(.NET Framework);

Informe um nome a seu gosto. Para o exemplo vou informar Crud_JSON;

Crie uma pasta chamada Dados e nesta pasta inclua o arquivo usuario.json.

Vamos criar uma classe chamada JsonCrud no projeto que vai conter os métodos para gerenciar as informações do arquivo

Abaixo temos o código desta classe:

using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Linq;
using static System.Console;
namespace Crud_JSON
{
    public class JsonCrud
    {
        public void DetalhesdoUsuario(string arquivoJson)
        {
            var json = File.ReadAllText(arquivoJson);
            try
            {
                var jObject = JObject.Parse(json);
                if (jObject != null)
                {
                    WriteLine("ID :" + jObject["id"].ToString());
                    WriteLine("Nome :" + jObject["nome"].ToString());
                    var endereco = jObject["endereco"];
                    WriteLine("Rua :" + endereco["rua"].ToString());
                    WriteLine("Cidade :" + endereco["cidade"].ToString());
                    WriteLine("Cep :" + endereco["cep"]);
                    JArray arrayExperiencias = (JArray)jObject["experiencias"];
                    if (arrayExperiencias != null)
                    {
                        WriteLine("Empresas");
                        foreach (var item in arrayExperiencias)
                        {
                            WriteLine("\tId :" + item["empresaid"]);
                            WriteLine("\tEmpresa :" + item["empresanome"].ToString());
                        }
                    }
                    WriteLine("Telefone :" + jObject["telefone"].ToString());
                    WriteLine("Cargo :" + jObject["cargo"].ToString());
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        //incluir empresa
        public void AdicionarEmpresa(string arquivoJson)
        {
                WriteLine("Informe o Id da empresa : ");
                var empresaId= Console.ReadLine();
                WriteLine("\nQual o nome da Empresa : ");
                var nomeEmpresa = Console.ReadLine();
                var novaEmpresaMembro = "{ 'empresaid': " + empresaId + ", 'empresanome': '" + nomeEmpresa + "'}";
                try
                {
                    var json = File.ReadAllText(arquivoJson);
                    var jsonObj = JObject.Parse(json);
                    var arrayExperiencias = jsonObj.GetValue("experiencias") as JArray;
                    var novaEmpresa = JObject.Parse(novaEmpresaMembro);
                    arrayExperiencias.Add(novaEmpresa);
                    jsonObj["experiencias"] = arrayExperiencias;
                    string novoJsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, 
Newtonsoft.Json.Formatting.Indented);
                    File.WriteAllText(arquivoJson, novoJsonResult);
                }
                catch (Exception ex)
                {
                    WriteLine("Erro ao adicionar : " + ex.Message.ToString());
                }
            }
            //deletar empresa
            public void DeletarEmpresa(string arquivoJson)
            {
                var json = File.ReadAllText(arquivoJson);
                try
                {
                    var jObject = JObject.Parse(json);
                    JArray arrayExperiencias = (JArray)jObject["experiencias"];
                    Write("Informe o ID da Empresa a deletar : ");
                    var empresaId = Convert.ToInt32(Console.ReadLine());
                    if (empresaId > 0)
                    {
                        var nomeEmpresa = string.Empty;
                        var empresaADeletar = arrayExperiencias.FirstOrDefault(obj => 
obj["empresaid"].Value<int>() == empresaId);
                        arrayExperiencias.Remove(empresaADeletar);
                        string saida = Newtonsoft.Json.JsonConvert.SerializeObject(jObject, 
Newtonsoft.Json.Formatting.Indented);
                        File.WriteAllText(arquivoJson, saida);
                    }
                    else
                    {
                        Write("O ID da empresa é inválido, tente novamente!");
                        AtualizarEmpresa(arquivoJson);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
            //atualizar empresa
            public void AtualizarEmpresa(string arquivoJson)
            {
                string json = File.ReadAllText(arquivoJson);
                try
                {
                    var jObject = JObject.Parse(json);
                    JArray arrayExperiencias = (JArray)jObject["experiencias"];
                    Write("Informe o ID da empresa a atualizar : ");
                    var empresaId = Convert.ToInt32(Console.ReadLine());
                    if (empresaId > 0)
                    {
                        Write("Informe o nome da empresa: ");
                        var nomeEmpresa = Convert.ToString(Console.ReadLine());
                        foreach (var empresa in arrayExperiencias.Where(obj => 
                                           obj["empresaid"].Value<int>() == empresaId))
                        {
                                  empresa["empresanome"] = !string.IsNullOrEmpty(nomeEmpresa) ? nomeEmpresa : "";
                        }
                        jObject["experiencias"] = arrayExperiencias;
                        string saida = Newtonsoft.Json.JsonConvert.SerializeObject(jObject, 
Newtonsoft.Json.Formatting.Indented);
                        File.WriteAllText(arquivoJson, saida);
                    }
                    else
                    {
                       Write("O ID da empresa é inválido, tente novamente!");
                       AtualizarEmpresa(arquivoJson);
                    }
                }
                catch (Exception ex)
                {
                    WriteLine("Erro de Atualização : " + ex.Message.ToString());
                }
            }
            //fim
    }
}

Neste código temos os métodos:

  1. DetalhesdoUsuario(string arquivoJson)
  2. AdicionarEmpresa(string arquivoJson)
  3. DeletarEmpresa(string arquivoJson)
  4. AtualizarEmpresa(string arquivoJson)

Cada método recebe o caminho do arquivo JSON que deverá tratar.

A seguir estamos usando os métodos para serializar e deserializar as informações realizando o CRUD.

No arquivo Program inclua o código a seguir:

using System;
using static System.Console;
namespace Crud_JSON
{
    class Program
    {
        static void Main(string[] args)
        {
            string arquivoJson = Environment.CurrentDirectory;
            arquivoJson = arquivoJson.Replace("\\bin\\Debug", "");
            arquivoJson = arquivoJson + "\\Dados\\usuario.json";
            JsonCrud jscrud = new JsonCrud();
            WriteLine("-- Operaçoes CRUD com arquivo JSON --");
            WriteLine("");
            while (true)
            {
                WriteLine("Opções : 1 - Incluir, 2 - Atualizar, 3 - Deletar, 4 - Selecionar \n");
                try
                {
                    var option = ReadLine();
                    switch (option)
                    {
                        case "1":
                            jscrud.AdicionarEmpresa(arquivoJson);
                            break;
                        case "2":
                            jscrud.AtualizarEmpresa(arquivoJson);
                            break;
                        case "3":
                            jscrud.DeletarEmpresa(arquivoJson);
                            break;
                        case "4":
                            jscrud.DetalhesdoUsuario(arquivoJson);
                            break;
                        default:
                            Main(null);
                            break;
                    }
                }
                catch (Exception ex)
                {
                    WriteLine("Erro : " + ex.Message);
                }
            }
        }
    }
}

No código acima criamos uma instância da classe JsonCrud e usamos os métodos para realizar o CRUD:

Simples assim...

Pegue o projeto aqui :   Crud_JSON.zip

"Grandes são as obras do Senhor, procuradas por todos os que nelas tomam prazer."
Salmos 111:2

Referências:


José Carlos Macoratti