Un’interessante novità introdotta con la versione 6.0 release 4 di Json.NET è la possibilità di eseguire il Merge (utilizzando 4 possibili “variazioni”) di oggetti JObject e Jarray. Un rapido esempio, tramite Web Api:
[HttpPost]
public void JsonStringPost([FromBody]string value)
{
JObject jCar = JObject.Parse(value);
JObject jOptional = JObject.Parse(@"{Optionals :['Air Conditioned','Smoker'] }");
jCar.Merge(jOptional, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union });
string jsonFormat = jCar.ToString();
Car mergedCar = jCar.ToObject<Car>();
}
Dove l’Action “JsonStringPost” accetta una stringa tipo:
"{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }"
Utilizzando, ad esempio il Composer di strumenti come Fiddler2 possiamo invocare il servizio:
Per ottenere una nuova istanza di Car con tutti gli Optionals:
Se il nostro servizio accetta direttamente un’istanza di oggetto invece di una stringa in formato JSON, il nostro codice cambia leggermente, come di seguito:
[HttpPost]
public void JsonObjectPost([FromBody] Car carByPost)
{
JObject jCar = JObject.FromObject(carByPost);
JObject jOptional = JObject.Parse(@"{Optionals :['Air Conditioned','Smoker'] }");
jCar.Merge(jOptional, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union });
string jsonFormat = jCar.ToString();
Car mergedCar = jCar.ToObject();
}
Dove utilizziamo il metodo FromObject della classe JObject invece di Parse. Utilizzando Fiddler, passando come Body del messaggio la stringa (senza i doppi apici ad inizio e fine stringa)
{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }
Otteniamo (ovviamente) lo stesso risultato dell’invocazione precedente. E’ possibile modificare il comportamento di “Merge” utilizzando l’enumerazione MergeArrayHandling. La classe Car (C#) è descritta nell’esempio, è la seguente:
public class Car
{
public string Brand { get; set; }
public string Model { get; set; }
public string[] Optionals { get; set; }
}
La lista completa delle features aggiunte nel rilascio della versione 6.0 release 4 è disponibile qui.