Deserializzare JSON che contiene una stringa JSON incorporata

Deserializzare JSON che contiene una stringa JSON incorporata

Quando invii posta, metti una lettera in una busta e metti le informazioni di instradamento sulla busta. Il servizio postale utilizza le informazioni di instradamento per consegnare la busta a una cassetta postale specifica. Il proprietario della casella di posta apre quindi la busta e legge la lettera.

A volte potrebbe essere necessario gestire l'equivalente JSON di questo scenario. Potresti avere un messaggio JSON che contiene informazioni di routing e contiene una stringa JSON incorporata.

Un uso di questo è quando si utilizza un'architettura di plug-in. Il servizio su cui sono caricati i plug-in può ricevere messaggi JSON e inoltrare il JSON incorporato al plug-in appropriato per un'ulteriore elaborazione.

In questo articolo mostrerò un esempio di codice che gestisce la deserializzazione di JSON che contiene una stringa JSON incorporata.

Generazione della busta JSON

Quello che segue è un esempio di busta JSON:

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

Contiene informazioni di routing e una stringa JSON incorporata. L'unica cosa speciale del JSON incorporato è che è stato sottoposto a escape/codificato.

Questo JSON è stato generato serializzando la classe seguente:

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

Il mittente genererebbe questa busta JSON serializzando prima il payload, quindi la busta, in questo modo:

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)

Instradamento della busta JSON

Il mittente invia la busta JSON a un servizio. Il servizio contiene una mappa del percorso che fornisce informazioni su come instradare i messaggi. Puoi popolare la mappa del percorso in molti modi (questo è fuori dallo scopo di questo articolo).

Il servizio deve deserializzare la busta JSON per ottenere le informazioni di routing. Una volta che ha le informazioni di instradamento, può instradare la stringa JSON incorporata al processore appropriato:

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:in questo esempio, utilizza i plug-in DLL. All'interno dei plugin, implementerebbero l'interfaccia IMessageProcessor (mostrata di seguito) e il servizio avrebbe gli oggetti del processore caricati in questa mappa. Questo è solo un modo per farlo. Il punto chiave è che il servizio ha informazioni che gli consentono di inoltrare il messaggio JSON al processore appropriato.

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

Elaborazione della stringa JSON incorporata

La stringa JSON incorporata viene passata al processore. Il JSON può quindi essere deserializzato nel tipo appropriato ed elaborato. In questo esempio, il JSON viene passato a una classe PaymentProcessor, che deserializza il JSON in un oggetto Payment.

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)