2013-08-08 11 views
5

Dzień dobry!Json .NET Serializacja - zmiana wartości właściwości

Jestem obecnie za pomocą Newtonsoft JSON serializer poprzez następujący kod:

 private string serializeAndIgnoreEmail(UserMembership obj) 
     { 
      var json = JsonConvert.SerializeObject(obj, Formatting.Indented, 
       new JsonSerializerSettings() { ContractResolver = new DocumentIdContractResolver() }); 
      return json; 
     } 
     private class DocumentIdContractResolver : CamelCasePropertyNamesContractResolver 
     { 
      protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
      { 
       return base.GetSerializableMembers(objectType).Where(o => o.Name != "Email").ToList(); 
      } 
     } 

Everytime muszę serializacji obiektu nazywam „serializeAndIgnoreEmail” metoda. Teraz chcę zastąpić zawartość każdej właściwości jej zaszyfrowaną wersją i nie wiem, gdzie to zrobić.

Domyślam się, że należy zastąpić metodę w "DocumentIdContractResolver", ale jest tak wiele CreateBlahBlahBlah, że ciężko z nimi pracować.

Czy to właściwe podejście, aby kontynuować modyfikowanie obiektu ContractResolver, czy też powinienem spróbować czegoś innego?

Dziękujemy!

Odpowiedz

7

Wywołanie SerializeObject powoduje dwie rzeczy: utworzenie drzewa tokenów JSON w oparciu o wskazany obiekt i przekształcenie go do postaci łańcucha zawierającego JSON.

Najlepiej byłoby zrobić dwa kroki osobno: najpierw poproś JSON.NET o dostarczenie drzewa tokenów JSON, następnie zmodyfikuj wartości, a następnie serializuj je do JSON.

Z mojej głowie:

namespace JsonEncryptionTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var obj = new 
       { 
        To = "Some name", 
        Subject = "A Subject", 
        Content = "A content" 
       }; 

      var jsonObject = JObject.FromObject(obj); 

      // modify the values. Just doing something here to amuse you. 
      var property = jsonObject.Property("Content"); 
      var value = (string) property.Value; 
      property.Value = value.ToLower(); 

      var json = jsonObject.ToString(); 

      Console.WriteLine(json); 
     } 
    } 
} 
1

nie robiłem dokładnie to samo. Ale w moim przypadku projektu web API, musiałem serializować nazwy łańcuchów wartości wyliczeniowych zamiast ich wartości numerycznych. Zrobiłem trochę badań i zdałem sobie sprawę, że konwertery formatów Json są domyślnie puste. Dodałem więc:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 

W twoim przypadku musisz napisać niestandardowy JsonConverter i dodać go do listy konwerterów. Podobny przykład można znaleźć tutaj:

Custom Json Converter