我正在尝试实现一个自定义的JSON.net IContractResolver,它将用指定的字符串替换所有null属性值.我知道这个功能可以通过序列化类型成员的属性获得; 这是我们正在考虑的替代路线.
到目前为止我的解析器实现如下.StringValueProvider是一个IValueProvider的简单实现,不会影响问题,这是我无法弄清楚如何获取值,property因为我不知道提供的实例的这个方法,member所以我无法传递它作为参数GetValue()(在代码示例中标记为WHAT-GOES-HERE?).
有没有办法,我能得到什么,我从需要member或property?
public class NullSubstitutionPropertyValueResolver : DefaultContractResolver
{
private readonly string _substitutionValue;
public NullSubstitutionPropertyValueResolver(string substitutionValue)
{
_substitutionValue = substitutionValue;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty result = base.CreateProperty(member, memberSerialization);
PropertyInfo property = member as PropertyInfo;
if (property == null)
{
return result;
}
// What do I use here to get the property value?
bool isNull = property.GetValue(WHAT-GOES-HERE?) == null;
if (isNull)
{ …Run Code Online (Sandbox Code Playgroud) 我们必须记录 Web 服务的传入请求和传出响应。这包括每个对象的 JSON 序列化,以便它们可以存储在数据库中。
某些信息被视为敏感信息(例如社会安全号码、信用卡号码等),我们不能根据 PCI 合规性将这些信息包含在我们的日志中。现在我们正在用占位符值(例如“[PRIVATE]”)手动替换这些值,但这仅适用于字符串属性。某些数据(例如出生日期)未存储为字符串,因此这不起作用,因为在序列化之前替换属性值。最大的问题是有人很容易忘记在记录之前删除敏感数据,这是非常不可取的。
为了解决这个问题,我想创建一个自定义属性并将其放置在属性上,然后让 JSON 序列化例程在每个属性上查找此属性,如果存在,请将序列化值替换为占位符,例如“[PRIVATE] ”。
现在我们使用 System.Web.Script.Serialization.JavaScriptSerializer 进行序列化。显然它对我的自定义属性一无所知。我将如何更改序列化过程,以便用我的自定义“SensitiveData”属性修饰的任何数据都替换为占位符值?我不反对使用不同的序列化程序,但希望我可以利用现有序列化程序的功能,而不是编写自己的序列化程序。