2014-03-15 3 views
1

У меня есть сложная иерархия классов, которые реализуют всю необходимую функциональность. Я ссылаюсь на базовый абстрактный класс из этой иерархии в моем классе serializable. Мне просто нужно добавить одно дополнительное свойство во время сериализации, но со стороны ему должно понравиться, что это свойство всегда было в этом классе. Прямо сейчас json.net привязывает его к названию свойства.Как легко украсить класс

public class SerializeMe 
{ 
    AbstractValidation _validation; 
    public SerializeMe(AbstractValidation validation) 
    { 
    this._validation = validation; 
    } 

    [JsonProperty(PropertyName = "designer|displayName")] 
    public string DisplayName 
    { 
    get { return string.Concat(_validation.Field, _validation.Type); } 
    } 

    public AbstractValidation Validation 
    { 
    get 
    { 
     return _validation; 
    } 
    } 
} 

Что я получаю, например:

{ 
    "DisplayName":"F_Director_Empl_Rolepresence", 
    "Validation":{ 
     "type":"presence", 
     "field":"F_Director_Empl_Role" 
    } 
    } 

мне нужно:

{ 
    "DisplayName":"F_Director_Empl_Rolepresence", 
    "type":"presence", 
    "field":"F_Director_Empl_Role" 
} 

Здесь мне нужно избавиться от раздела Validation - как будто отображаемое_имя является частью класса AbstractValidation. Я мог наследовать классы от предков AbstractValidation, но иерархия довольно сложная. Вместо этого я ищу способ украсить классы.

ответ

1

Для того, чтобы сделать то, что вы хотите, вам нужно будет сделать обычай JsonConverter для вашего класса SerializeMe. Возможно, что-то вроде этого:

class CustomConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(SerializeMe); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     SerializeMe sm = (SerializeMe)value; 

     // Get child properties into a JObject 
     JObject obj = JObject.FromObject(sm.Validation); 

     // Now add the parent properties we're interested in 
     obj.Add("DisplayName", sm.DisplayName); 

     // Write the object to the output 
     obj.WriteTo(writer); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

После того, как у вас есть конвертер, украсить свой SerializeMe класс с атрибутом [JsonConverter] так, что Json.Net знает использовать собственный конвертер:

[JsonConverter(typeof(CustomConverter))] 
public class SerializeMe 
{ 
    ... 
} 

Тогда сериализовать как обычно , Вот демо:

AbstractValidation av = new AbstractValidation 
{ 
    Field = "F_Director_Empl_Role", 
    Type = "presence" 
}; 
SerializeMe sm = new SerializeMe(av); 

string json = JsonConvert.SerializeObject(sm, Formatting.Indented); 
Console.WriteLine(json); 

Выход:

{ 
    "Type": "presence", 
    "Field": "F_Director_Empl_Role", 
    "DisplayName": "F_Director_Empl_Rolepresence" 
} 
Смежные вопросы