2016-07-06 15 views
5

Czy istnieje sposób na usunięcie ustawień z klasy JsonSerializer i ponowne wprowadzenie ich w nowym JsonSerializer?Skopiuj JsonSerializerSettings z JsonSerializer do nowego JsonSerializer

Nie ma żadnych metod, aby coś takiego zrobić. Najlepsze, co znalazłem, to prywatna metoda, którą można nazwać odbiciem, ApplySerializerSettings.

Próbuję wziąć serializator z metody WriteJson i skopiować go do nowego serializera, nieco go ulepszając. W szczególności chcę zastąpić ContractResolver.

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 

Odpowiedz

3

Wydaje się, że najlepszym sposobem jest skopiowanie wszystkich ustawień do nowego obiektu. Jest ich mnóstwo, więc jest tu dobra metoda rozszerzenia (od wersji 8.0.3).

Jest brzydki, ale przynajmniej trzeba go napisać tylko raz. Należy zachować ostrożność, ponieważ same właściwości nie są głęboko kopiowane.

Odpowiedź poniżej jest niestabilna w zależności od implementacji, szczególnie w przypadku rozwiązywania umowy. Trzymaj go na wszelki wypadek, jeśli komuś pomaga.


Tak, nie mogę całkiem skopiować ustawień, ale znalazłem dobrą pracę, która mogłaby chcieć zostać wzięta pod uwagę. Możesz po prostu ustawić właściwości, które chcesz zmienić, w zamkniętym kontekście, a następnie zresetować je później.

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    var thing = value as IThing; 

    if (thing == null) 
     throw new ArgumentException($"Writing Json failed because " + 
      "value was not a 'Thing' of type, {typeof(IThing).FullName}"); 

    JObject jsonThing; 
    //If your solution is multithreaded, 
    //and is using a shared serializer (which you probably are), 
    //you should lock the serializer so that it doesn't accidentally use 
    //the "CustomObjectResolver" 
    lock (serializer) 
    { 
     //Hold the original value(s) to reset later 
     var originalContractResolver = serializer.ContractResolver; 
     //Set custom value(s) 
     serializer.ContractResolver = new CustomObjectResolver(); 
     //Serialization with custom properties 
     jsonThing = JObject.FromObject(value, serializer); 
     //Reset original value(s) 
     serializer.ContractResolver = originalContractResolver; 
    } 

    //Finish serializing and write to writer. 
} 
+1

Dzięki, oszczędzam mi pisania! Trochę obrzydliwe, że musimy to zrobić, ale naprawdę powinno być coś wbudowanego w Newtonsoft.Json – Tyson