如何无缝地装饰课程

时间:2014-03-15 21:50:00

标签: .net json json.net

我有一些复杂的类层次结构,可以实现所有需要的功能。我在我的serialiazable类中引用了该层次结构中的基本抽象类。我只需要在序列化期间添加一个额外的属性,但是从侧面看它应该是该属性一直在该类中。现在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"
 }

这里我需要摆脱验证部分 - 就像DisplayName是AbstractValidation类的一部分一样。我可以从AbstractValidation的祖先继承类,但层次结构非常复杂。相反,我正在寻找装饰类的方法。

1 个答案:

答案 0 :(得分: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"
}