我有一些复杂的类层次结构,可以实现所有需要的功能。我在我的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的祖先继承类,但层次结构非常复杂。相反,我正在寻找装饰类的方法。
答案 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"
}