【问题标题】:Dynamically change custom converter for nested type动态更改嵌套类型的自定义转换器
【发布时间】:2015-12-17 10:57:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 感谢您的回答!我更喜欢坚持使用 Json.NET 并手动反序列化模型。
    【解决方案2】:

    最终进行了以下手动转换。由于它是架构更改,因此可以轻松地对旧模型进行硬编码:

    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);
        }
    
        //...
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多