Crear y leer ficheros Json fácilmente en C# con JsonNET


En esta entrada vamos a ver cómo trabajar fácil y eficientemente con ficheros Json en un programa con C# gracias a la librería Json.NET.

No hay duda que el formato Json se ha convertido en uno de los estándares para el intercambio de datos estructurados en entre servicios Web multiplataforma.

El formato Json presenta algunas ventajas frente a sus competidores (como xml), como un menor tamaño de archivo, ser más fácil de entender por una persona, o una generación y procesado más rápido.

Aunque habitualmente asociamos los ficheros Json con Javascript, los principales lenguajes de programación disponen de librerías para trabajar con ficheros Json de forma cómoda.

Anuncio:

Por supuesto, C# no es una excepción. El framework .NET soporta Json de forma nativa desde la versión 4.0. Pero su uso es aún más sencillo y eficiente gracias a la popular librería Open Source Json.NET, cuyo código está disponible en https://github.com/JamesNK/Newtonsoft.Json.

Usar la librería Json.NET

Añadir la librería Json.NET a nuestro programa es sencillo ya que está disponible como un paquete Nutget. Simplemente tenemos que añadirlo a través del gestor de paquetes y estaremos listos para trabajar.

Vamos a ver brevemente el uso de Json.NET. Para ello, creamos un objeto que tenga la estructura del Json con el que queremos trabajar.

public class Product
{
	public string Name { get; set; }
	public DateTime ExpiryDate { get; set; }
	public decimal Price { get; set; }
	public string[] Sizes { get; set; }
}

Serializar Json

Para realizar la serialización simplemente tendremos que llamar a la función SerializeObject.

var product = new Product
{
	Name = "Apple",
	ExpiryDate = new DateTime(2008, 12, 28),
	Price = 3.99M,
	Sizes = new[] {"Small", "Medium", "Large"}
};			

string json = JsonConvert.SerializeObject(product);

Ahora con este string podemos hacer lo que necesitemos como, por ejemplo, guardarlo a un fichero.

string path = @"c:\product.json";
System.IO.File.WriteAllText(path, json);

O enviarlo por una petición HTTP.

var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "POST"; 
request.ContentType = "application/xml; charset=utf-8"; 
request.Timeout = 30000; 

string json = JsonConvert.SerializeObject(product);
byte[] byteArray = Encoding.UTF8.GetBytes(json);
request.ContentLength = byteArray.Length;

var dataStream = new StreamWriter(request.GetRequestStream()); 
dataStream.Write(byteArray); 
dataStream.Close();

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
	dataStream = response.GetResponseStream ();  	
	using (Stream stream = response.GetResponseStream())
	{
		using (StreamReader reader = new StreamReader(stream))
		{
			string responseFromServer = reader.ReadToEnd ();
		}
	}
}

Deserializar Json

Parsear un fichero Json es igualmente sencillo gracias a la función DeserializeObject,

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);

Por supuesto, el string lo podemos obtener de cualquiera forma disponible. Por ejemplo, leerlo desde un fichero existen.

string path = @"c:\product.json";
using (StreamReader jsonStream = File.OpenText(path))
{
    var json = jsonStream.ReadToEnd();
    Product product = JsonConvert.DeserializeObject<Product>(json);
}

O como respuesta de a través de una petición Http

string url = @"http://www.direccionUrlDeTuJson.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    var json = reader.ReadToEnd();
    Product product = JsonConvert.DeserializeObject<Product>(json);
}

Estos son solo algunas de las muchas funciones disponibles en Json.NET. Para más información consultar los ejemplos disponibles en la página web de la librería.

Como vemos, Json.NET convierte en trivial trabajar con ficheros Json en C#. Sin duda una librería de referencia en .NET, y una herramienta a añadir a nuestra lista de favoritos.

4.2 12 votes
Article Rating

Anuncio:

Previous Copiar un mando inalámbrico 315/433Mhz con Arduino
Next Resolver robots articulados con Arduino
6 Comments
oldest
newest
Inline Feedbacks
View all comments
anRoswell Harris
2 years ago

Compañero muchas gracias por este articulo, me fue de mucha utilidad…

Gregory
2 years ago

Gracias amigo me fue de mucha ayuda!

sali
2 years ago

muchas gracias, fue super útil.

Alejandro
1 year ago

Hola a @todos, estoy teniendo un problema cuando intento serializar on objeto, estoy obteniendo una exception del tipo SystemOutOfMemory, creo que está relacionado directamente con el tamaño del objeto porque cuando reduzco el tamaño del mismo todo funciona bien, alguna idea de cómo solucionar este problema? Gracias

Wilson
1 year ago

Hola amigo muchas gracias por el artículo, tengo una duda supongamos que yo envió un json desde una web como haría para recibirlo en un programa en c#