[JSON.NET] Custom Creation Converter

Javier Torrecilla
Jtorrecilla .NET
Published in
2 min readMay 31, 2017

La verdad es que hacia bastante tiempo que no podía escribir un artículo por falta de tiempo, pero aquí va algo que he tenido que utilizar estos últimos días, y creo que es bastante interesante.

Estoy involucrado en un desarrollo con un sistema de colas de mensajes y en función del mensaje llevar a cabo una determinada tarea.

Vamos a partir que todos los mensajes de nuestra implementación van heredar de una clase base como la siguiente:

Nuestro problema viene a que tendremos N clases que hereden nuestra clase base, y tendríamos que leerlas para poder llevar a cabo el mapeo de los datos de nuestros mensajes al objeto del tipo deseado.

Aquí entra en juego uno de los paquetes nuget, mas descargados JSON.NET o Newtonsoft, el famoso serializador / deserializador de objetos a formato JSON.

Uno de los parámetros del método DeserializeObject del objeto JsonConvert, es un objeto que implemente la clase base CustomCreationConverter<T>. El objetivo de esta clase va a ser sobreescribir la manera de leer los datos a deserializar.

Para nuestro objetivo vamos a crear una implementacion de dicha clase:

Dentro del método ReadJson será encargado de llevar a cabo la lectura de la cadena que contenga el mensaje.

El método Create, va a recibir un objeto de tipo JObject (procedente también de JSON.NET), y nos va a permitir llevar a cabo el acceso a determinadas propiedades del mensaje. En nuestro caso, nos interesa acceder a la propiedad Type, y a través de un diccionario donde tenemos todos los posibles tipos a devolver, crearemos el nuevo tipo a utilizar.

Por ultimo, a través del método Populate se rellenara el objeto y se podrá utilizar posteriormente.

JsonConvert.DeserializeObject<BaseQueueMessage>(message, new MessageConverter());

En el próximo artículo, veremos la integración de esto con RabbitMQ.

Espero que os sea de utilidad, y cualquier comentario es bienvenido!

--

--

Javier Torrecilla
Jtorrecilla .NET

Geek, Map 2010, MCC 2011, MVP C# 2011/12 Msdn Forum MOD