Deserializar JSON que contiene una cadena JSON incrustada

Deserializar JSON que contiene una cadena JSON incrustada

Cuando envía correo, coloca una carta en un sobre y coloca la información de ruta en el sobre. El servicio postal utiliza la información de enrutamiento para entregar el sobre en un buzón específico. El dueño del buzón luego abre el sobre y lee la carta.

A veces, es posible que deba lidiar con el equivalente JSON de este escenario. Es posible que tenga un mensaje JSON que tenga información de enrutamiento y contenga una cadena JSON incrustada.

Un uso de esto es cuando está usando una arquitectura de complemento. El servicio que tiene los complementos cargados puede recibir mensajes JSON y retransmitir el JSON incrustado al complemento adecuado para su posterior procesamiento.

En este artículo, mostraré un ejemplo de código que maneja la deserialización de JSON que contiene una cadena JSON incrustada.

Generando el sobre JSON

El siguiente es un ejemplo de un sobre JSON:

{
	"To": "PaymentProcessor",
	"Payload": "{\"Id\":\"1\",\"Amount\":20.21}"
}
Code language: JSON / JSON with Comments (json)

Contiene información de enrutamiento y una cadena JSON incrustada. Lo único especial del JSON incrustado es que se ha escapado/codificado.

Este JSON se generó al serializar la siguiente clase:

public class JsonEnvelope
{
	public string To { get; set; }
	public string Payload { get; set; }
}
Code language: C# (cs)

El remitente generaría este sobre JSON serializando primero la carga útil, luego el sobre, así:

var jsonEnvelope = new JsonEnvelope()
{
	To = "PaymentProcessor",
	Payload = JsonSerializer.Serialize(new Payment()
	{
		Id = "1",
		Amount = 20.21m
	})
};

var jsonToSend = JsonSerializer.Serialize(jsonEnvelope, options);
Code language: C# (cs)

Enrutamiento del sobre JSON

El remitente envía el sobre JSON a un servicio. El servicio contiene un mapa de rutas que proporciona información sobre cómo enrutar mensajes. Puede completar el mapa de ruta de muchas maneras (aunque eso está fuera del alcance de este artículo).

El servicio tiene que deserializar el sobre JSON para obtener la información de enrutamiento. Una vez que tiene la información de enrutamiento, puede enrutar la cadena JSON incrustada al procesador apropiado:

public static void Route(string json)
{
	var jsonEnvelope = JsonSerializer.Deserialize<JsonEnvelope>(json);

	var processor = routeMap[jsonEnvelope.To];

	processor.Process(jsonEnvelope.Payload);
}
private static readonly Dictionary<string, IMessageProcessor> routeMap = new Dictionary<string, IMessageProcessor>();
Code language: C# (cs)

Nota:En este ejemplo, está usando complementos DLL. Dentro de los complementos, implementarían la interfaz IMessageProcessor (que se muestra a continuación) y el servicio tendría los objetos del procesador cargados en este mapa. Esta es solo una forma de hacerlo. El punto clave es que el servicio tiene información que le permite transmitir el mensaje JSON al procesador apropiado.

public interface IMessageProcessor
{
	void Process(string json);
}
Code language: C# (cs)

Procesando la cadena JSON incrustada

La cadena JSON incrustada se pasa al procesador. Luego, el JSON puede deserializarse en el tipo apropiado y procesarse. En este ejemplo, el JSON se pasa a una clase PaymentProcessor, que deserializa el JSON en un objeto de pago.

public class PaymentProcessor : IMessageProcessor
{
	public void Process(string paymentJson)
	{
		var payment = JsonSerializer.Deserialize<Payment>(paymentJson);

		Console.WriteLine($"Processing payment {payment.Id}");
	}
}
public class Payment
{
	public string Id { get; set; }
	public decimal Amount { get; set; }
}
Code language: C# (cs)