Cómo manipular y usar JSON con C# en WinForms

Muchos desarrolladores prefieren usar JSON en vez de XML en la web por gran cantidad de razones, entre ellas:

  • JSON requiere menos tags que XML, los objetos XML deben estár encerrados en el elemento que lo defined, sin embargo con JSON solo tienes que nombrar el tag y ya está.
  • JSON es mejor cuando se trata de ayudar a decidir que hacer en un procedimiento con JavaScript.
  • JSON es mucho mas fácil de leer que el XML (al menos para gran cantidad de desarrolladores).
  • JSON es una lista ordenada. En muchos lenguages, como JavaScript puede ser interpretado como un array, vector, lista o secuencia fácilmente.
  • Y muchas otras razones ...

Por lo tanto, si un servicio web decide por alguna razon usar solo JSON para enviar información (practica cuestionable), estáras estancado por un rato si no sabes como manipular correctamente información en formato JSON con C#.

En este articulo aprenderás a como manipular JSON usando la famosa librería JSON.NET que te permite leer, serializar y deserializar JSON en WinForms.

Requisitos

  • Visual Studio con Manager de paquetes NuGet (>=2010).

Instalando JSON.NET

Procede a crear tu aplicación de WinForms como siempre lo haces usando la última versión del Framework .NET. Despues de que lo hayas creado, necesitaremos incluir la librería JSON.NET como una dependencia en el proyecto.

JSON.NET es una librería de alto rendimiento que te permite manipular JSON en la plataform .NET. Puedes serializar y deserializar cualquier objeto .NET con el potente serializador de JSON.

Porque usar la librería JSON.NET? 

  • Json.NET hace realmente la manipulación de JSON en C# fácil y hace lo complejo, lucir bastante sencillo.
  • Crea, 
  • Create, convertir, hacer consultas y modificar JSON using el objeto JObject de Json.NET's, JArray y JValue.
  • Json.NET es compatible con Windows, Windows Store, Windows Phone, Mono e incluso Xamarin.
  • Json.NET es de código abierto y es completamente gratis para su uso comercial.
  • Json.NET es realmente rápido, mucho más rápido que DataContractJsonSerializer y 250% más rápido que la clase JavaScriptSerializer.

Compara el rendimiento de esta librería con otras reconocidas librerías para manipular JSON en C#:

JSON.NET performance comparison.

Para instalar Json.NET en tu proyecto, haz click derecho en el explorador de soluciones en tu Proyecto en la parte superior derecha de Visual Studio y del menú desplegable selecciona Administrar Paquetes NuGet.

CefSharp nugget package manager

Una vez el menú aparezca, escribe JSON.NET en el buscador, selecciona el Paquete de Newtonsoft.Json e instalalo.

Nota

Como en cada versión de Visual Studio la interfaz puede cambiar, asegurate de que instalas la distribución de Newtonsoft.json por The James Newton-King localizado en la fuente de paquetes nuget.org. En este ejemplo usamos Visual Studio 2015.

Json.NET NuGet package manager

Sigue el proceso de instalación, acepta terminos y condiciones. Durante la instalación obtendrás información relacionada sobre el proceso en la consola:

Attempting to gather dependency information for package 'Newtonsoft.Json.8.0.3' with respect to project 'UniversalSandbox', targeting '.NETFramework,Version=v4.5.2'
Attempting to resolve dependencies for package 'Newtonsoft.Json.8.0.3' with DependencyBehavior 'Lowest'
Resolving actions to install package 'Newtonsoft.Json.8.0.3'
Resolved actions to install package 'Newtonsoft.Json.8.0.3'
  GET https://api.nuget.org/packages/newtonsoft.json.8.0.3.nupkg
  OK https://api.nuget.org/packages/newtonsoft.json.8.0.3.nupkg 27ms
Installing Newtonsoft.Json 8.0.3.
Adding package 'Newtonsoft.Json.8.0.3' to folder 'F:\C# Development\Winform projects\UniversalSandbox\packages'
Added package 'Newtonsoft.Json.8.0.3' to folder 'F:\C# Development\Winform projects\UniversalSandbox\packages'
Added package 'Newtonsoft.Json.8.0.3' to 'packages.config'
Executing script file 'F:\C# Development\Winform projects\UniversalSandbox\packages\Newtonsoft.Json.8.0.3\tools\install.ps1'...
Successfully installed 'Newtonsoft.Json 8.0.3' to UniversalSandbox
========== Finished ==========

Finalmente podrás usar Json.NET en tu proyecto.

Usando JSON.NET

Como primera medida, no olvides incluir la libreria en la clase que manipulará JSON:

using Newtonsoft.Json;

Ahora, verás una colección básica de manipulación de JSON con C# (serialización y deserialización):

Leer JSON

Puedes leer una cadena de JSON de la misma manera en la que lees XML usando JsonTextReaderStringReader (uso básico):

using Newtonsoft.Json;
using System.IO;

string json = @"{
   'CPU': 'Intel',
   'PSU': '500W',
   'Drives': [
     'DVD read/writer'
     /*(broken)*/,
     '500 gigabyte hard drive',
     '200 gigabype hard drive'
   ]
}";

JsonTextReader reader = new JsonTextReader(new StringReader(json));
while (reader.Read())
{
    if (reader.Value != null)
    {
        Console.WriteLine("Token: {0}, Valor: {1}", reader.TokenType, reader.Value);
    }
    else
    {
        Console.WriteLine("Token: {0}", reader.TokenType);
    }
}

// Token: StartObject
// Token: PropertyName, Valor: CPU
// Token: String, Valor: Intel
// Token: PropertyName, Valor: PSU
// Token: String, Valor: 500W
// Token: PropertyName, Valor: Drives
// Token: StartArray
// Token: String, Valor: DVD read/writer
// Token: Comment, Valor: (broken)
// Token: String, Valor: 500 gigabyte hard drive
// Token: String, Valor: 200 gigabype hard drive
// Token: EndArray
// Token: EndObject

Serializar un objeto dinámico (ExpandoObject) a JSON

Nada es mejor que trabajar con objetos en JavaScript, es una experiencia casi placentera pues los objetos son dinamicos y nos permiten hacer y guardar todo tipo de cosas. Que sería aun mejor que poder trabajar de la misma manera (con objetos dinamicos) en C#?

El siguiente ejemplo muestra como trabajar de la misma manera que en Javascrip usando ExpandoObject que nos permite agregar nuevas propiedades a un objeto.

Nota 

La serialización soporta casi todo tipo de objeto, no solamente objetos Expando.

using System.Dynamic;

dynamic myObject = new ExpandoObject();

myObject.nombre = "Our Code World";
myObject.sitioweb = "http://ourcodeworld.com";
myObject.lenguaje = "es-CO";

List<string> articulos = new List<string>();
articulos.Add("Como usar JSON con C#");
articulos.Add("Top 5: Mejores calendarios jQuery");
articulos.Add("Otro articulo ... ");

myObject.articulos = articulos;

string json = JsonConvert.SerializeObject(myObject);

Console.WriteLine(json);

//{  
//   "nombre":"Our Code World",
//   "sitioweb":"http://ourcodeworld.com",
//   "lenguaje":"en-US",
//   "articulos":[
//      "Como usar JSON con C#",
//      "Top 5: Mejores calendarios jQuery",
//      "Otro articulo ... "
//   ]
//}

Deserializar una cadena de JSON a una clase parcial

Puedes leer una cadena de texto JSON y convertirla a una clase existente de C# en vez de leerla propiedad por propiedad y asignar valores. Para ello usa el método DeserializeObject.

La clase en este caso se llamara SearchResult y tendrá la siguiente estructura:

public class SearchResult
{
    public string Title { get; set; }
    public string Content { get; set; }
    public string Url { get; set; }
}

Now the code to process it should look like :

using Newtonsoft.Json.Linq;

string googleSearchText = @"{
'responseData': {
'results': [
 {
 'GsearchResultClass': 'GwebSearch',
 'unescapedUrl': 'http://en.wikipedia.org/wiki/Paris_Hilton',
 'url': 'http://en.wikipedia.org/wiki/Paris_Hilton',
 'visibleUrl': 'en.wikipedia.org',
 'cacheUrl': 'http://www.google.com/search?q=cache:TwrPfhd22hYJ:en.wikipedia.org',
 'title': '<b>Paris Hilton</b> - Wikipedia, the free encyclopedia',
 'titleNoFormatting': 'Paris Hilton - Wikipedia, the free encyclopedia',
 'content': '[1] In 2006, she released her debut album...'
 },
 {
 'GsearchResultClass': 'GwebSearch',
 'unescapedUrl': 'http://www.imdb.com/name/nm0385296/',
 'url': 'http://www.imdb.com/name/nm0385296/',
 'visibleUrl': 'www.imdb.com',
 'cacheUrl': 'http://www.google.com/search?q=cache:1i34KkqnsooJ:www.imdb.com',
 'title': '<b>Paris Hilton</b>',
 'titleNoFormatting': 'Paris Hilton',
 'content': 'Self: Zoolander. Socialite <b>Paris Hilton</b>...'
 }
],
'cursor': {
 'pages': [
 {
 'start': '0',
 'label': 1
 },
 {
 'start': '4',
 'label': 2
 },
 {
 'start': '8',
 'label': 3
 },
 {
 'start': '12',
 'label': 4
 }
 ],
 'estimatedResultCount': '59600000',
 'currentPageIndex': 0,
 'moreResultsUrl': 'http://www.google.com/search?oe=utf8&ie=utf8...'
}
},
'responseDetails': null,
'responseStatus': 200
}";

JObject googleSearch = JObject.Parse(googleSearchText);

// Obtener la propiedades result en una lista 
IList<JToken> results = googleSearch["responseData"]["results"].Children().ToList();

// Serializa resultados JSON a un objeto .NET
IList<SearchResult> searchResults = new List<SearchResult>();

foreach (JToken result in results)
{
    SearchResult searchResult = JsonConvert.DeserializeObject<SearchResult>(result.ToString());
    searchResults.Add(searchResult);
}

// Lista las propiedades del resultado de la busqueda (IList)
foreach (SearchResult item in searchResults)
{
    Console.WriteLine(item.Title);
    Console.WriteLine(item.Content);
    Console.WriteLine(item.Url);
}

// Title = <b>Paris Hilton</b> - Wikipedia, the free encyclopedia
// Content = [1] In 2006, she released her debut album...
// Url = http://en.wikipedia.org/wiki/Paris_Hilton

// Title = <b>Paris Hilton</b>
// Content = Self: Zoolander. Socialite <b>Paris Hilton</b>...
// Url = http://www.imdb.com/name/nm0385296/

Puedes leer más ejemplos si visitas la documentación oficial de la librería aquí.

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable