由于架构更改,我需要根据控制器级别的API版本或客户端版本来控制属性b的反序列化。
public class MyModel
{
public string a { get; set; }
// old: public string b { get; set; }
public string[] b { get; set; }
}
我希望实现一个自定义转换器,如果版本旧,可以将string []写为单个字符串。
在构建响应时,我反序列化父模型,并且只想在这一个属性上使用自定义转换器。
public class ParentModel
{
public MyModel myModel { get; set; }
}
这意味着b的属性不起作用。如何根据需要为一个属性植入这样的自定义转换器(按类型而不是属性名称打开自定义转换器)?
答案 0 :(得分: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);
答案 1 :(得分: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);
}
//...
}
}