【问题标题】:Conditional output processing in JSON.NETJSON.NET 中的条件输出处理
【发布时间】:2012-11-05 13:16:58
【问题描述】:

具有以下类:

class Test {
  [MyAttr]
  public string Name;
}

如果我需要将所有标有MyAttr 的属性的值修剪为特定长度,我该如何扩展JSON.NET?似乎我无法在自定义 JsonConverter 中执行此操作,因为我需要访问代表 origin 属性的 MemberInfo

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    在深入阅读文档和源代码之后,看起来合同解析器是可行的方法:

    public class MyCustomConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType) {
            return true;
        }
    
        public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
            throw new NotImplementedException();
        }
    
        public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
            if (value == null) {
                writer.WriteNull();
                return;
            }
            string str = value.ToString().Substring(1, 2);
            writer.WriteValue(str);
        }
    }
    
    public class MaskContractResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {
            JsonProperty property = base.CreateProperty(member, memberSerialization);
            if (member.CustomAttributes.Any(x => typeof(MyAttr).IsAssignableFrom(x.AttributeType)))
                property.Converter = new MyCustomConverter();
            return property;
        }
    }
    

    像馅饼一样简单!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多