创建可屏蔽敏感信息的自定义json转换器 [英] create custom json converter that masks sensitive information

查看:105
本文介绍了创建可屏蔽敏感信息的自定义json转换器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个自定义json转换器,它将序列化一个对象并屏蔽包含某些敏感信息的某些字段.我已经创建了转换器,但是当我使用转换器序列化对象时,我得到的是空字符串.有人可以告诉我我在做什么错吗?

I'm writing a custom json converter that will serialize an object and mask certain fields that contains some sensitive information. I've created the converter, but when I'm serializing the object using my converter, I'm getting an empty string. Can someone tell me what I'm doing wrong?

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

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

But I'm always getting an empty string.

推荐答案

请查看自定义JsonConverter 示例.

我认为最好在您的评论中针对另一个问题发布另一个问题,但是无论如何,我已经玩了一点,并给出了以下代码.我认为它比我以前发布的要好得多,因此我更喜欢删除以前的示例.之所以对我来说这段代码好得多,是因为它不会更改您要序列化的Student对象,而只适用于JObject实例.

I think it would be better to post another question for the other issue in your comment, but anyway, I've played a bit and came out with the following code. I think it is far better than what I posted before, so I prefer removing my previous sample. The reason why this code seems far better to me is that it does not alter the Student object you are trying to serialize, but simply works on the JObject instance.

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

这篇关于创建可屏蔽敏感信息的自定义json转换器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆