创建掩盖敏感信息的自定义json转换器

时间:2018-05-29 15:03:17

标签: c# serialization json.net

我正在编写一个自定义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);

但我总是得到一个空字符串。

1 个答案:

答案 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));
}