Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如何编写基于属性更改属性的自定义json序列化程序_C#_Json_Serialization_Attributes - Fatal编程技术网

C#-如何编写基于属性更改属性的自定义json序列化程序

C#-如何编写基于属性更改属性的自定义json序列化程序,c#,json,serialization,attributes,C#,Json,Serialization,Attributes,我有一个包含PersonalData的poco类,如下所示: 公共类用户信息 { [个人资料] 公共字符串名称{get;set;} [个人资料] 公共字符串地址{get;set;} [个人资料] 公共日期时间Dob{get;set;} 公共bool IsActive{get;set;} } 我有很多场景,我序列化了这个对象,我想做的是在序列化过程中屏蔽Pii数据,如“****”——例如,我将其序列化为写入日志 我尝试用以下代码实现我自己的序列化程序: 公共类PersonalDataSerial

我有一个包含PersonalData的poco类,如下所示:

公共类用户信息
{
[个人资料]
公共字符串名称{get;set;}
[个人资料]
公共字符串地址{get;set;}
[个人资料]
公共日期时间Dob{get;set;}
公共bool IsActive{get;set;}
}
我有很多场景,我序列化了这个对象,我想做的是在序列化过程中屏蔽Pii数据,如“****”——例如,我将其序列化为写入日志

我尝试用以下代码实现我自己的序列化程序:

公共类PersonalDataSerializer:JsonConverter
其中T:new()
{
公共覆盖布尔CanConvert(类型为typeToConvert)
{
返回typeToConvert.HasPiiData();
}
公共覆盖T Read(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
//读这里。。。
抛出新的NotImplementedException();
}
公共重写无效写入(Utf8JsonWriter writer、T值、JsonSerializerOptions选项)
{
//写在这里。。。
抛出新的NotImplementedException();
}
}
我不知道如何实现write方法,而不只是执行正常的序列化,然后尝试使用属性计算属性并执行某种字符串操作

如果自定义实现在每个属性上而不是整个对象上,则更容易实现

我使用此方法识别具有
PersonalData
属性的类型上的属性:

公共静态类类型扩展
{
公共静态bool HasPiiData(此类型)
{
返回类型.GetProperties().Any(p=>p.IsPiiData());
}
公共静态bool IsPiiData(此属性info prop)
{
foreach(属性CustomAttributes中的var att)
{
if(att.AttributeType==typeof(PersonalDataAttribute))
{
返回true;
}
if(att.AttributeType.Name.Contains(“PersonalData”))
{
返回true;
}
}
返回false;
}
}

任何关于如何基于属性实现自定义序列化的建议都将不胜感激:-)

您应该使用一个而不是转换器。查看哪一个看起来是重复的。看起来您正在基于转换器中的方法签名使用
System.Text.Json
。您是否被锁定在该库中,或者是否可以切换到Newtonsoft.Json(Json.Net)?Newtonsoft可能会更好,因为3.1兼容性是
System.Text.Json
而不是Json.Net。在
System.Text.Json
中,我想不出任何方法可以轻松做到这一点,因为它相当于Json.NET的契约解析器是内部的。请参阅。如果您可以切换到Newtonsoft,那么可以在他的第一条评论中看到@dbc链接到的答案,或者查看使用合同解析器解决类似问题的示例。或者请参阅,了解使用Newtonsoft的LINQ to JSON API的不同方法。