System.Text. Json Сериализация пустых строк в глобальные пустые строки. - PullRequest
0 голосов
/ 17 января 2020

При переносе кода из newtonsoft json в system.text. json

Мне нужно, чтобы все пустые строки отображались как пустые строки.

Я написал следующий конвертер, но все пустые строки значения по-прежнему отображаются как нулевые.

И для нулевых строковых значений метод записи не вызывается. Точка останова никогда не достигается.

    public class EmptyStringConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            => Convert.ToString(reader.GetString(), CultureInfo.CurrentCulture);

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
        {
            if (writer == null)
                throw new ArgumentNullException(nameof(writer));
            writer.WriteStringValue(value ?? "");
        }
    }

Код запуска

    services.AddControllers()
        .AddJsonOptions(option =>
        {
            option.JsonSerializerOptions.Converters.Add(new EmptyStringConverter());
        });

Пример консоли

    class Program
    {
        static void Main(string[] args)
        {
            var jsonSerializerOptions = new JsonSerializerOptions();
            jsonSerializerOptions.Converters.Add(new EmptyStringConverter());
            var json = JsonSerializer.Serialize(new Model() { FirstName = null }, jsonSerializerOptions);
        }
    }

    public class EmptyStringConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            => Convert.ToString(reader.GetString(), CultureInfo.CurrentCulture);

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
        {
            if (writer == null)
                throw new ArgumentNullException(nameof(writer));
            writer.WriteStringValue(value ?? "");
        }
    }

    public class Model
    {
        public string FirstName { get; set; }
    }

1 Ответ

0 голосов
/ 18 января 2020

@ Халил, не могли бы вы дать пример кода? В моем сообществе VS2017 вызывается метод Write.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var emptyStringConverter = new EmptyStringConverter();
            emptyStringConverter.Write(null, null, null);
        }
    }
}

EmptyStringConverter class:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace ConsoleApp1
{
    public class EmptyStringConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            throw new NotImplementedException();
        }

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
        {
            ;
        }
    }
}
...