создать собственный конвертер json, который маскирует конфиденциальную информацию - PullRequest
0 голосов
/ 29 мая 2018

Я пишу специальный конвертер 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 голосов
/ 29 мая 2018

Пожалуйста, посмотрите на 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...