我正在编写一个自定义json转换器,它将序列化一个对象并屏蔽包含一些敏感信息的某些字段。我已经创建了转换器,但是当我使用转换器序列化对象时,我得到一个空字符串。有人能告诉我我做错了吗?
public class Student
{
public string Name { get; set; }
public string Phone { get; set; }
}
class StudentJsonConverter : JsonConverter
{
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is Student student)
{
student.Phone = MaskString(student.Phone);
}
writer.WriteStartObject();
serializer.Serialize(writer, value);
writer.WriteEndObject();
}
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
/// <inheritdoc />
public override bool CanConvert(Type objectType) => typeof(Student) == objectType;
private static string MaskString(string sensitiveInformation) => string.IsNullOrWhiteSpace(sensitiveInformation) ? null : new string('*', sensitiveInformation.Length);
}
我在这里使用它:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new StudentJsonConverter());
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
var student = new Student { Name = "name", Phone = "1234" };
var serializedString = JsonConvert.SerializeObject(student, settings);
Console.WriteLine(serializedString);
但我总是得到一个空字符串。
答案 0 :(得分:0)
请查看Custom JsonConverter示例。
修改强>
我认为最好在你的评论中为另一个问题发布另一个问题,但无论如何,我已经玩了一下,并提出了以下代码。我认为它比我之前发布的要好得多,所以我更喜欢删除我以前的样本。这个代码对我来说好得多的原因是它不会改变你试图序列化的Student对象,而只是在JObject实例上工作。
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Newtonsoft.Json.Linq.JToken t = Newtonsoft.Json.Linq.JToken.FromObject(value);
JObject jo = (JObject)t;
if (value is Student)
{
jo["Phone"] = MaskString(jo.Value<string>("Phone"));
if (String.IsNullOrEmpty(jo.Value<string>("Name")))
{
jo.Remove("Name");
}
}
serializer.Serialize(writer, jo, typeof(Student));
}