Сериализуйте и десериализуйте промежуток времени между Json.Сеть и система.Текст.Json

#c# #json.net

Вопрос:

У меня есть asp.net основной веб-api, использующий System.Text.Json для сериализации в JSON. На моем клиенте Blazor wasm я использую json.net, так как NSwag генерирует клиента с помощью этого. Теперь у меня возникла проблема во время десериализации временных интервалов. Я уже добавил пользовательский конвертер:

     public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        => TimeSpan.Parse(reader.GetString() ?? string.Empty);

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

Для a TimeSpan.FromHours(3.5) это возвращает значение json 03:30:00 , которое для меня выглядит нормально. Но когда я пытаюсь разобрать это в json.net Я получаю следующее исключение:

Невозможно десериализовать текущий объект JSON (например, {«имя»:»значение»}) в систему типа’.TimeSpan» , потому что для правильной десериализации типа требуется примитивное значение JSON (например, строка, число, логическое значение, null).

Поэтому я проверил, что json.net сама производит вот это и вышло значение: "02:30:00" . Когда я добавляю кавычки к указанному выше значению, оно также десериализуется правильно. Есть ли у меня способ рассказать json.net чтобы десериализовать временной интервал без этих дополнительных кавычек?

Комментарии:

1. Вы, вероятно, захотите написать конвертер, будь то для System.Text. Json для сериализации или для JSON.NET при десериализации.

2. @PanagiotisKanavos, когда я просто сериализую промежуток времени, фактический текст JSON в json.net является упомянутым ""02:30:00"" . В Системе.Текст. Джсон, это так "02:30:00" .

3. Опубликуйте фактический текст json. Только числовые значения могут отображаться без кавычек. Если ваша строка JSON содержит myProp: 03:30:00 недопустимый текст

4. In System.Text.Json it's 02:30:00. нет, это не так. JSON есть JSON, независимо от того, какую библиотеку вы используете для его создания. Стандартного способа сериализации продолжительности или времени суток (две разные вещи) не существует, поэтому в обоих случаях вам нужен конвертер. Однако в обоих случаях выходные данные всегда будут указаны в кавычках, например { TimeOfDay: "03:30:00"}

5. Я думаю, мы не говорим об одном и том же. Когда я сериализую только промежуток времени. Я получаю результат выше. Когда я сериализую весь dto, у меня получается что-то вроде { "Property" : "03:30:00"} . Но суть все равно остается в силе. Json.net хочет, чтобы это было { "Property" : ""03:30:00""}