Convertir un archivo de texto a Json con Json.Net

Fecha de Publicación: 2020-08-09


Introducción

En este ejercicio crearemos un proyecto de consola para crear un Json a partir de un archivo de texto con la librería Json.Net.

Requisitos

  • Visual Studio Community
  • Libreria Json.Net
  • Archivo de codigos postales de México



Resultado

La siguiente imagen muestra lo que obtendremos al realizar este ejercicio:





Codigo Fuente

Descargar

Ejercicio

Comenzaremos como siempre abriendo nuestro Visual Studio y creando nuestra solución con un proyecto de consola para este ejemplo lo llamare ConvertFileToJson. Si no tienes conocimiento de como crearlo te dejo el link donde puedes aprender como hacerlo y regresar despues a este ejercicío.





En cuanto lo tengamos creado, nos posicionaremos en nuestro explorador de soluciones y daremos clic derecho sobre nuestro proyecto, despues nos posicionaremos en Administrar paquetes Nuget y daremos clic izquierdo.



Se mostrara una ventana donde nos permitira administrar nuestras librerias instaladas del repositorio Nuget, por default nos posicionara en Instalado nosotros seleccionaremos la pestala Examinar, a mi por default me mostro en el primer resultado la libreria Newtonsoft.Json la cual instalaremos en nuestro proyecto:



Daremos clic en Instalar.

Ahora nos mostrara una ventana donde nos solicitara la confirmación para instalar la libreria en nuestro proyecto, daremos clic en Aceptar y esperaremos a que Visual Studio instale la librería:



Una vez que Visual Studio haya terminado de instalar la librería para confirmar que ya la tenemos agregada en nuestro proyecto nos regresaremos a la pestaña de Instalado en nuestro administrador de paquetes Nuget:



Aqui confirmaremos que realmente haya sido instalada la libreria, una vez realizado esto cerramos la pestaña y abriremos nuestro archivo Program.cs.



Como ya lo mencione en los requisitos del ejercicio, necesitaremos un archivo de texto con el cual trabajar, para este ejercicio ocuparemos el archivo de codigos postales de México, si aun no lo tienes en la sección Requistos y Referencias dejo el link para descargarlo. Bien, ahora lo que haremos será crear una clase con los encabezados de los codigos que queremos serializar. Nos posicionaremos en nuestro Explorador de soluciones a continuación daremos clic derecho sobre nuestro proyecto despues en Agregar -> Nuevo elemento...



Nos desplegara una pantalla con el titulo Agregar nuevo elemento - ConvertFileToJson selecionaremos Clase y en el campo Nombre escribiremos Header. Al finalizar daremos clic en Agregar.



Abriremos la clase Header y declararemos como propiedades los encabezados del archivo que previamente descargamos quedando de la siguiente forma:



Ahora abriremos nuestro App.config y dentro declararemos una key con el nombre de PathFile y la ruta donde se encuentra nuestro archivo de texto quedando de la siguiente forma:



En este paso procederemos a agregar las referencias a librerias del sistema que ocuparemos en nuestro ejercicio, para ello daremos clic derecho en Referencias en nuestro explorador de soluciones y despues en Agregar referencia...



Nos abrira una ventana llamada Administrador de referencias donde seleccionaremos la sección de Ensamblados y buscaremos la referencia System.Configuration y marcaremos la casilla donde nos aparezca la palomita quedando de la siguiente manera:



Daremos clic en Aceptar

Abriremos la clase Program.cs y agregaremos las siguientes librerias:

  • System.Configuration
  • System.IO
  • NewtonSoft.Json
Quedando de la siguiente manera nuestra clase:



En la misma clase en nuestro metodo Main declararemos un par de variables tipo string donde la primera llamada strPathFile alojara el path de nuestro archivo de texto y la segunda llamada strBuffer el contenido una vez leido el archivo. A continuación declaramos la instrucción:

        
          strPathFile = ConfigurationManager.AppSettings["PathFile"].ToString();
        
      
con la cual indicamos que guardaremos en la variable la ruta del archivo de texto y finalmente leeremos el contenido del archivo con la instrucción:
        
            strBuffer = File.ReadAllText(strPathFile, Encoding.Default);
        
      
Nuestras instrucciones deberian de verse similar a lo siguiente:
        
        static void Main(string[] args)
        {
            string strPathFile = string.Empty,
                   strBuffer = string.Empty;

            strPathFile = ConfigurationManager.AppSettings["PathFile"].ToString();

            strBuffer = File.ReadAllText(strPathFile, Encoding.Default);
        }
        
      
Aqui la imagen desde Visual Studio:



Ahora realizaremos una prueba de ejecución para ver que todo vaya bien hasta este punto, colocaremos un punto de interrupción en la linea donde guardamos el contenido del archivo en la varible tipo string.


Como vemos el programa funciona correctamente y en el punto de interrupción podemos visualizar que strBuffer no esta vacía y contiene datos con que trabajar.



Ahora lo que haremos sera convertir nuestro buffer en una lista para poder serializarlo, crearemos un metodo para trabajar con el buffer de texto que tenemos en memoria, primero declararemos una lista nula en nuestro metodo Main:

        
            List '<'Header> lst = null;
        
        
      
Y despues declaramos el metodo que se encargara de obtener la lista:
        
            lst = GetListCp(strBuffer);
        
      

Ahora daremos un rapido análisis de nuestro archivo de codigos postales, en la imagen siguiente se puede observar que cada linea esta separada por un Enter y dentro de cada linea los campos vienen separados por un caracter | (pipe), entonces estos definiran la manera en la cual separaremos nuestras lineas y campos.


La declaración del metodo de GetListCp basandonos en el análisis previo tendra la siguientes instrucciones con las que separan el buffer primero en lineas y luego en campos, eso lo realizamos con el metodo split primero con \r\n (Enter)y despues con el caracter | (pipe) quedando de la siguiente manera las instrucciónes:
        
            strBuffer.Split(new[] { "\r\n" }, StringSplitOptions.None) //En lineas

            strLine.Split(new[] { "|" }, StringSplitOptions.None); // En campos
        
      
En el cuerpo del metodo utilizaremo un switch para iterar los valores y por posición sera que clasificaremos en la clase los campos con los datos correspondientes quedando de la siguiente forma:
        
        static List'<'Header> GetListCp(string strBuffer)
        {
            List'<'Header> lstCp = new List'<'Header>();

            foreach (string strLine in strBuffer.Split(new[] { "\r\n" }, StringSplitOptions.None))
            {
                string[] aryFields = strLine.Split(new[] { "|" }, StringSplitOptions.None);

                Header cp = new Header();

                for (int i = 0; i < aryFields.Count(); i++)
                {
                    switch (i)
                    {
                        case 0:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.d_codigo = aryFields[i];
                            }
                            break;
                        case 1:
                            cp.d_asenta = aryFields[i];
                            break;
                        case 2:
                            cp.d_tipo_asenta = aryFields[i];
                            break;
                        case 3:
                            cp.D_mnpio= aryFields[i];
                            break;
                        case 4:
                            cp.d_estado = aryFields[i];
                            break;
                        case 5:
                            cp.d_ciudad = aryFields[i];
                            break;
                        case 6:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.d_CP = aryFields[i];
                            }
                            break;
                        case 7:
                            cp.c_estado = aryFields[i];
                            break;
                        case 8:
                            cp.c_oficina = aryFields[i];
                            break;
                        case 9:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.c_CP = aryFields[i];
                            }
                            break;
                        case 10:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.c_tipo_asenta = aryFields[i];
                            }
                            break;
                        case 11:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.c_mnpio = aryFields[i];
                            }
                            break;
                        case 12:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.id_asenta_cpcons = aryFields[i];
                            }
                            break;
                        case 13:
                            cp.d_zona = aryFields[i];
                            break;
                        case 14:
                            if (!String.IsNullOrEmpty(aryFields[i]))
                            {
                                cp.c_cve_ciudad = aryFields[i];
                            }
                            break;
                    }
                }

                lstCp.Add(cp);
            }
            return lstCp;
        }            
        
      

Y en Visual Studio así:

Ahora realizaremos una prueba de ejecución para ver que todo vaya bien hasta este punto, colocaremos un punto de interrupción en la linea donde llamamos al metodo GetListCp y ejecutamos la prueba.


Como podemos observar al momento de terminar de ejecutar el metodo GetListCp la lista ya contiene datos y si visualizamos uno al azar podemos observar que ya contiene información del codigo postal.



Ya para finalizar el ejercicío declararemos una variable tipo string con el nombre de strJson vacia y el metodo que vamos a utilizar de la libreria Json.Net es JsonConvert.SerializeObject(obj); el cual pide para serializar un objeto, como nostros tenemos una lista de objetos entonces tenemos que iterar dicha lista para convertir uno por uno los objetos alojados en ella quedando de la siguiente forma:

        
        static void Main(string[] args)
        {
            string strPathFile = string.Empty,
                   strBuffer = string.Empty,
                   strJson = string.Empty;

            List'<'Header> lst = null;

            strPathFile = ConfigurationManager.AppSettings["PathFile"].ToString();

            strBuffer = File.ReadAllText(strPathFile, Encoding.Default);

            lst = GetListCp(strBuffer);

            foreach(Header obj in lst)
            {
                strJson += JsonConvert.SerializeObject(obj);
            }
        }
        
      
Y aqui en imagen desde Visual Studio:



Para finalizar este ejercicio colocaremos un punto de interrupción despues del foreach que acabamos de insertar y ejecutamos nuestro programa:

Como podemos observar en el contenido de la variable strJson ya contiene información y si lo visualizamos el contenido como Json entonces visualizaremos correctamente la información.



Y con esto hemos finalizado el ejercicio!!!

Muchas gracias y si te fue util el ejercicio por favor hazmelo saber en las formas de contacto que se muestran en la parte inferior.

Hasta la proxima.

Referencias