Deserializza parte dell’object JSON e serializza nuovamente con le restanti proprietà intatte

Ho alcuni JSON che voglio deserializzare in un’istanza di una class C #. Tuttavia, la class non ha tutti i campi / proprietà che corrispondono al JSON originale. Vorrei poter modificare i valori della proprietà nella class e quindi serializzarlo nuovamente su JSON con i restanti campi e proprietà del JSON originale ancora intatti.

Ad esempio, supponiamo di avere il seguente JSON:

{ "name": "david", "age": 100, "sex": "M", "address": "far far away" } 

E voglio deserializzare in questa class:

 class MyClass { public string name { get; set; } public int age { get; set; } } 

Dopo la deserializzazione, ho impostato quanto segue:

 myClass.name = "John"; myClass.age = 200; 

Ora voglio serializzarlo nuovamente su JSON e ottenere questo risultato:

 { "name": "John", "age": 200, "sex": "M", "address": "far far away" } 

C’è un modo per farlo usando Json.Net?

È ansible utilizzare la funzione “dati di estensione” di Json.Net per gestirlo.

Aggiungi un nuovo Dictionary proprietà alla class e contrassegnalo con un attributo [JsonExtensionData] . (Puoi renderlo una proprietà privata se non vuoi influenzare l’interfaccia pubblica della tua class.) Alla deserializzazione, questo dizionario sarà riempito con qualsiasi dato che non corrisponde a nessuna delle altre proprietà pubbliche della tua class. In caso di serializzazione, i dati nel dizionario verranno riscritti nel JSON come proprietà dell’object.

 class MyClass { public string name { get; set; } public int age { get; set; } [JsonExtensionData] private Dictionary otherStuff { get; set; } } 

Ecco una demo:

 class Program { static void Main(string[] args) { string json = @" { ""name"": ""david"", ""age"": 100, ""sex"": ""M"", ""address"": ""far far away"" }"; MyClass obj = JsonConvert.DeserializeObject(json); Console.WriteLine("orig name: " + obj.name); Console.WriteLine("orig age: " + obj.age); Console.WriteLine(); obj.name = "john"; obj.age = 200; json = JsonConvert.SerializeObject(obj, Formatting.Indented); Console.WriteLine(json); } } 

Produzione:

 orig name: david orig age: 100 { "name": "john", "age": 200, "sex": "M", "address": "far far away" } 

Ok, quindi dopo aver postato la domanda, sono andato a pranzo, sono tornato e ho trovato la soluzione. Invece di usare i “dati di estensione” di JSON.nets, ho scoperto che hanno una funzione “fusione” http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4- json-merge-dipendenza-iniezione

IMO Penso che questo sia molto più pulito e ho deciso di seguire questo metodo.

Di seguito c’è un campione che stavo scrivendo

 public class Cell { public string Text { get; set; } public int ID { get; set; } public CellStyle Style { get; set; } } public class CellStyle { public string BgColor { get; set; } public string TextColor { get; set; } } string json = @"{ 'Text': 'My Cell', 'ID': 20, 'TsID': 100, 'Style': { 'BgColor' : 'Red', 'TextColor' : 'Black', 'Caption' : 'Help My Cell', } }"; var orgCell = JsonConvert.DeserializeObject(json); orgCell.Style.TextColor = "White"; orgCell.Style.BgColor = "Blue"; var obj = JsonConvert.SerializeObject(orgCell); JObject o1 = JObject.Parse(json); JObject o2 = JObject.Parse(obj); o1.Merge(o2, new JsonMergeSettings { // union array values together to avoid duplicates MergeArrayHandling = MergeArrayHandling.Union }); o1.ToString(); // gives me the intended string