代码之家  ›  专栏  ›  技术社区  ›  Buda Gavril

创建隐藏敏感信息的自定义JSON转换器

  •  0
  • Buda Gavril  · 技术社区  · 6 年前

    我正在编写一个自定义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 回复  |  直到 6 年前
        1
  •  0
  •   PSkalka    6 年前

    请看一下 Custom JsonConverter 样品。

    编辑:

    我认为最好是在你的评论中为另一个问题发布另一个问题,但无论如何,我已经玩了一点,并给出了以下代码。我认为它比我以前发布的要好得多,所以我更喜欢删除以前的样本。对于我来说,这段代码似乎要好得多的原因是它不会改变您试图序列化的学生对象,而只是在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));
    }