En este tutorial aprenderás a manipular cadenas JSON desde cero en c#, vamos a crear y leer cadenas JSON en C# con la librería oficial System.Text.Json.

Para empezar debemos importar la librería System.Text.Json desde el administrador de paquetes NuGet en Visual Studio para nuestra aplicación de consola y luego pasaremos al primer punto.

Si tu proyecto apunta a .NET Core 3.0 (o superior) solo se instalará una librería en caso de que sea .NET Framework 4.7 te pedirá descargar e instalar otras dependencias pero no cambia la forma de usar la librería.

Abra el administrador de paquetes NuGet
Dirigirse al administrador de paquetes NuGet en Herramientas > Administrador de paquetes NuGet > Administrar paquetes NuGet para la solución
Busque e instale la libreria System.Text.Json
De clic en examinar y utilice el cuatro de búsqueda para localizar la librería System.Text.Json y agréguela a su proyecto.
Acepte los cambios
Acepte los cambios para proceder a la descarga e instalación de la librería.

Crear cadenas JSON

Para crear una cadena JSON vamos a utilizar el método Utf8JsonWriter  que nos permite la escritura de un texto en formato JSON, inicialmente vamos a trabajar todo en memoria por lo que usaremos MemoryStream  que nos otorga un buffer dinámico.

Los parámetros necesarios para crear una instancia de Utf8JsonWriter  son un Stream y JsonWriterOptions , como mencionamos MemoryStream  nos va a otorgar el Stream  necesario y de tamaño variable.

El segundo es JsonWriterOptions  que es una estructura que nos permite personalizar el comportamiento del escritor JSON y nos da 3 propiedades :

  • Encoder : Nos permite definir el codificador a usar por Utf8JsonWriter este valor es nulo por defecto y esto indica que se utilizar el predeterminado
  • Indented : Obtiene o establece un valor de tipo bool (True o False) que le indica al escritor si debe aplicar un formato a la salida JSON como sangría a los tokens, adición de líneas nuevas y espacios, en otras palabras te muestra todo bonito.
  • SkipValidation : Obtiene o establece un valor de tipo bool que le indica al escritor si puede o no omitir la validación estructural permitiendo que el usuario escriba cadenas invalidas.

Ahora vamos a codificar, primero vamos a declarar el objeto de tipo JsonWriterOptions de nombre jsonWOpt y en este caso solo vamos a asignarle un valor a su propiedad Indented= true para que nos muestre la cadena JSON a como estamos acostumbrados.

Luego utilizando el bloque using  vamos a crear un objeto de tipo MemoryStream ms que será nuestro espacio en memoria y nuevamente dentro de ese bloque utilizaremos otro bloque using donde vamos a crear un objeto pero ahora de tipo Utf8JsonWriter el cual inicializaremos con el ms y jsonWOpt.

Ahora solo queda estructurar el contenido de nuestro texto JSON, al inicio de nuestra cadena hay una llave { por lo que de acuerdo a la documentación de la librería utilizaremos el método WriteStartObject() este escribirá el principio del objeto JSON.

Después agregaremos las propiedades a nuestro objeto, en mi caso quiero poner nombre y seguido el nombre que quiera poner, por ejemplo scrapywar.com utilizando el método WriteString del Utf8JsonWriter.

También agregare otro pero ahora será un numero, en mi caso una edad con el método WriteNumber() voy a colocar el nombre de la propiedad edad y el valor que seria 22

Así podríamos seguir añadiendo propiedades a nuestro objeto JSON yo me conformo con esos dos para no hacer las cosas mas extensas, al terminar de agregar las propiedades vamos a añadir WriteEndObject(); que nos dará el final del objeto } .

Ahora que hemos terminado de crear el objeto JSON vamos a sacarlo de la memoria y asignarlo a una variable de tipo string jsonstr , para ello vamos a convertir los bytes almacenados en nuestro MemoryStream ms con la función Encoding.UTF8.GetString().

Al ultimo podremos imprimir la cadena para ver como quedo nuestro objeto. El código completo quedaría de la siguiente forma

Si quieres almacenar tu cadena a un archivo ya solo deberías agregar File.WriteAllText("yo.json", jsonstr); antes de cerrar el primer using, con eso se almacenara el archivo en la misma carpeta del programa con el nombre yo.json .

Ahora veremos como leer una cadena JSON y obtener los valores de sus propiedades.

Leyendo cadenas JSON

Anteriormente ya aprendimos a crear cadenas JSON y ahora vamos a ver como leer las propiedades que le hemos añadido, para ello ahora vamos a utilizar los métodos de JsonDocument que es una clase que nos permite obtener los datos de las propiedades del JSON.

En este caso mi cadena es la siguiente:

Primero creamos un objeto de tipo JsonDocumentOptions JDOps y como es una estructura le podemos personalizar las propiedades que son las siguientes:

  • AllowTrailingCommas: Obtiene o establece un valor de tipo bool que indica si se permiten o se ignora una coma adicional al final de una lista de valores JSON.
  • CommentHandling: Obtiene o establece un valor que determina como maneja los comentarios, en este caso se recibe un valor de la enumeración JsonCommentHandling que contiene:
    • Allow: Que permite los comentarios dentro del JSON y son tratados como tokens validos
    • Disallow: Donde los comentarios causan que el JSON sea tomado como invalido y genera una excepción.
    • Skip: Que permite los comentarios pero los ignora y es como sino existieran.
  • MaxDepth: Obtiene o establece la profundidad máxima permitida al analizar datos JSON, y el valor predeterminado (es decir, 0) indica una profundidad máxima de 64.

Luego vamos a crear un objeto de tipo JsonDocument y lo que vamos a hacer es inicializarlo con una cadena en formato JSON la cual será analizada con JsonDocument.Parse() el cual tiene varias sobrecargas pero nosotros utilizaremos Parse(String, JsonDocumentOptions).

 

El objeto jsondoc contiene el contenido de la cadena JSON y ahora lo trataremos como un documento, inicialmente nos debemos encontrar en la raíz del documento JSON para poder acceder a las propiedades de la misma, por lo tanto vamos a crear un JsonElement que nombrare Root que será igual al jsondoc.RootElement; esta función nos posiciona en la Raíz de dicho documento.

Ahora si, podemos disponer de los valores de cada propiedad, con la función GetProperty() que recibe como argumento el nombre de la propiedad y devuelve el valor que esta almacene.

De esa forma podemos obtener los valores de las cadenas JSON, y el código quedaría como lo siguiente:

Podemos anidar los elementos en caso de que se requiera, por ejemplo para leer esta cadena:

Donde para acceder a la contraseña debemos anidar la propiedad admins dentro de un nuevo JsonElement y ese nuevo podrá acceder a la propiedad contraseña, esto se haría de la siguiente manera:

Ahora en caso de que tengamos un Array de objetos dentro de una propiedad como la siguiente cadena, donde tenemos otro objeto en Admins

En este caso vamos a utilizar un foreach para obtener los datos de cada objeto, lo haremos de la siguiente forma:

Espero que no haya sido tan confuso este tema aunque en la parte de abajo les dejo el proyecto de ejemplo para que lo puedan estudiar a detalle y noten como funciona.

Demo

En el siguiente Fiddle te muestro como funciona el ejemplo en .NET Core 3.1, como ya mencionaba al principio, puedes utilizar este tutorial con .NET Framework 4.7 y automáticamente se descargan las dependencias necesarias.

Descargas

Puedes descargar el programa de ejemplo, es posible que debas volver a instalar la librería, en dado caso solo realiza los pasos que están al inicio de esta entrada y todo quedara solucionado.

Descargar el código fuente del tutorial

De esta forma es que podemos crear y leer cadenas JSON todo en C# de una forma fácil, esto nos puede ayudar en proyectos futuros, siempre puedes consultar la documentación oficial o preguntar en los comentarios.

Visita nuestra categoría C# y encuentra más tutoriales como este!

Documentación de System.Text.Json