2015-12-17 2 views
1

Из-за изменения схемы мне нужно управлять десериализацией свойства b в зависимости от версии API или версии клиента с уровня контроллера.Динамическое изменение пользовательского конвертера для вложенного типа

public class MyModel 
{ 
    public string a { get; set; } 

    // old: public string b { get; set; } 
    public string[] b { get; set; } 
} 

Я ищу для реализации пользовательского конвертера для записи строки [] в виде одной строки, если версия старая.

При построении ответа я десериализую родительскую модель и хочу использовать настраиваемый конвертер только для этого свойства.

Это означает, что атрибут b не будет работать. Как я могу внедрить такой настраиваемый конвертер по требованию только одного свойства (настраиваемые преобразователи включаются типом, а не именем свойства)?

ответ

1

Проверить ниже код

public class ParentModelJSONConverter : JavaScriptConverter 
    { 

     public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
     { 
      throw new ApplicationException("Serializable only"); 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      Dictionary<string, object> result = new Dictionary<string, object>(); 
      ParentModel myobj = obj as ParentModel; 
      if (myobj != null) 
      { 
       // Add your conditions 
       result.Add("MyKeyName", myobj.myModel); 
      } 
      return result; 
     } 

     public override IEnumerable<Type> SupportedTypes 
     { 
      get { return new Type[] { typeof(ParentModel) }; } 
     } 
    } 

Для использования выше код

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ParentModelJSONConverter() }); 
String json = serializer.Serialize(objParentModel); 
+0

Спасибо за ответ! Я предпочитаю придерживаться Json.NET и просто десериализую модель вручную. –

0

Законченное делает следующее преобразование вручную. Поскольку это изменение схемы, старая модель может быть легко зашиты:

public class CustomConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var o = (MyModel)value; 

     writer.WriteStartObject(); 

     writer.WritePropertyName("a"); 
     writer.WriteValue(o.a); 

     writer.WritePropertyName("b"); 
     writer.WriteValue(o.b[0]); 

     writer.WriteEndObject(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(MyModel); 
    } 

    //... 
} 

}