JSON.NET中的条件输出处理

时间:2012-11-05 13:16:59

标签: c# .net json json.net

拥有以下课程:

class Test {
  [MyAttr]
  public string Name;
}

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

1 个答案:

答案 0 :(得分:3)

在深入阅读文档和源代码之后,看起来合同解析器就是最佳选择:

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;
    }
}

就像馅饼一样简单!