动态更改嵌套类型的自定义转换器

时间:2015-12-17 10:57:28

标签: c# json asp.net-web-api json.net deserialization

由于架构更改,我需要根据控制器级别的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的属性不起作用。如何根据需要为一个属性植入这样的自定义转换器(按类型而不是属性名称打开自定义转换器)?

2 个答案:

答案 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);
    }

    //...
}

}