Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71

Json десериализация TimeOnly

04.07.2023, 15:40. Показов 1117. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Проект на framework 4.8, в нем dateonly и timeonly нету, скачал пакет nuget.

Далее нужно было сохранить словарь
C#
1
Dictionary<TimeOnly, List<string>>
Использую Newtonsoft.Json

Сериализует нормально в формате HH:mm.
При десериализации ругается, не может преобразовать.
Покапался, нашел конвертер.

C#
1
2
3
4
5
6
7
8
Public class TimeOnlyJsonConverter: JsonConverter<TimeOnly>
{
    private const string Format ="HH:mm:ss.FFFFFFF";
    public override TimeOnly ReadJson(JsonReader reader,Type objectType, TimeOnly existingValue, bool hasExistingValue, JsonSerializer serialiser)
       => TimeOnly.ParseExact((string)reader.Value, Format, CultureInfo.InvariantCulture);
    public override void WriteJson(JsonWriter writer, TimeOnly value, JsonSerializer serializer)
      => writer.WriteValue(value.ToString(Format, CultureIngo.InvariantCulture));
}
Сериализовал он и раньше нормально, а вот с расшифровкой никак.
Делаю так

C#
1
Dic=JsonConvert.DeserializeObject<Dictionary<TimeOnly, List<string >>>(File.ReadAllText(path), new TimeOnlyJsonConverter);
И нифига, не удается конвертировать например 10:30 в таймонли
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2023, 15:40
Ответы с готовыми решениями:

Десериализация JSON
Делая запрос на сервер я получаю {&quot;data&quot;:,&quot;is_mature&quot;:false}],&quot;pagination&quot;:{}} И из этого мне надо вытащить в string: user_name,...

Десериализация JSON
Есть данные от известного источника в JSON: {&quot;response&quot;:} При помощи Newtonsoft.Json они успешно распарсиваются в структуру: public...

Десериализация JSON
Забыл как десериализовать строку JSON без класса в массив вот строка -

20
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
04.07.2023, 21:21
Цитата Сообщение от Alt56 Посмотреть сообщение
Проект на framework 4.8, в нем dateonly и timeonly нету
...
JsonConverter<TimeOnly>
во-первых, JsonConverter - это .NET(Core), разумеется таких типов нет вообще в .Net4. А пакет разумеется уже для актуальных .NET версий.

Цитата Сообщение от Alt56 Посмотреть сообщение
Dictionary<TimeOnly, List<string>>
Во-вторых, Supported key types, где этого типа нет.
И да, самое правильное решение которое всем рекомендуют - свой конвертер для любого типа.

TimeOnly - ещё только недавно "подвезли". Или ещё не добавили, или уже нашли какую-то сложность из-за чего не стали добавлять. Даже не вникал. Этим типом пока пользуются наверное.... почти никто.

Добавлено через 1 минуту
Цитата Сообщение от Alt56 Посмотреть сообщение
"HH:mm:ss.FFFFFFF"
...
например 10:30 в таймонли
в-третьих, навскидку. С чего б ему его определить то с такой маской? Сами то попробуйте сделать парсинг такой строки в нужное время? Когда получится - начинайте снова.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3429 / 2748 / 575
Регистрация: 04.09.2018
Сообщений: 8,624
Записей в блоге: 3
04.07.2023, 22:28
Цитата Сообщение от HF Посмотреть сообщение
почти никто
Я пользуюсь. И TimeOnly и DateOnly
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
04.07.2023, 23:34  [ТС]
Даже не вникал
Маска может и HH:mm:ss быть, TimeOnly.Parse("10:30") вполне определяет.И словарь прекрасно этот тип поддерживает, попробуйте сначала потом говорите.

Пакет этот скачан для framework, в нет кор уже эти структуры включены
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,689
Записей в блоге: 2
05.07.2023, 01:32
Лучший ответ Сообщение было отмечено nicolas2008 как решение

Решение

Цитата Сообщение от Alt56 Посмотреть сообщение
Маска может и HH:mm:ss быть, TimeOnly.Parse("10:30") вполне определяет.И словарь прекрасно этот тип поддерживает, попробуйте сначала потом говорите.
Да боже мой. Пошёл и проверил конечно же, убедился и не стал исправлять сообщение.
Вот противоречия.

- TimeOnly.ParseExact - вы сами его в примере приводите, сами в ошибку попали и... что сейчас пытаесь доказать? что ошибки то и не было? Вы вроде не писали что проблема устранена.
- TimeOnly.ParseExact - использует маску, обязательную маску. Причём тут TimeOnly.Parse?
- с использованием маски будет парситься только при "HH:mm". Зачем тогда изначально формировать такое значение - с миллисекундами? Это было требование или вы где-то накопипастили и пытались выполнить бездумно?

Цитата Сообщение от Alt56 Посмотреть сообщение
Пакет этот скачан для framework, в нет кор уже эти структуры включены
Вот этот пакет OlegRa/System.DateTimeOnly что ли?
И учитывая выше сказанное - достаточно понять что вы хотите и написать нормальное правило. И без непонятного пакета всё будет работать.

Вот про "System.Text.Json" я ошибся. Не заметил что используется "Newtonsoft.Json".
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 09:15  [ТС]
Конвертер я взял отсюда http://https://github.com/Jame... ssues/2521

Вопрос тогда почему он не сериализуется в формате маски.

Добавлено через 1 час 50 минут
Словарь при добавлении записи обрезает почему то до минут
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 09:18
Цитата Сообщение от Alt56 Посмотреть сообщение
Словарь при добавлении записи обрезает почему то до минут
Как добавляете в словарь?
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 09:35  [ТС]
Вручную

C#
1
Dic.add(new TimeOnly(10 , 30, 00), new List {"aaa"; "bbb"});
Обрезает до 10.30 при любом значении минут, секунд..
Не хочется снова в DateTime лезть (
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 09:47
Цитата Сообщение от Alt56 Посмотреть сообщение
Обрезает до 10.30 при любом значении минут, секунд..
Вы просто смотрите вывод TimeOnly.ToString(), который по умолчанию выводит только часы и минуты. Секунды же сохраняются.

Добавлено через 58 секунд
Можете проверить:
C#
1
2
3
        TimeOnly t1 = new(10, 30, 15), t2 = new(10, 30, 55), t3 = new(10, 30, 15);
        Console.WriteLine(t1 == t2);
        Console.WriteLine(t1 == t3);
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 09:51  [ТС]
Ну просто он этот вывод (только часы и минуты) и записывает в строку json а потом распознать не может

Я так понимаю единственное решение добавлять кпк DateTime а потом извлекать как TimeOnly.FromDateTime
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 09:55
Цитата Сообщение от Alt56 Посмотреть сообщение
а потом распознать не может
Распознать не может, потому что вы вызываете TimeOnly.ParseExact, который требует точного соответствия маске, а она у вас другая. Преобразуйте из строки в TimeOnly с помощью TimeOnly.Parse просто.
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 09:58  [ТС]
Вроде пробывал, но попробую еще, спасибо
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 10:05
Цитата Сообщение от Alt56 Посмотреть сообщение
но попробую еще
https://dotnetfiddle.net/0YP8fb

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Globalization;
using System.Collections.Generic;
using Newtonsoft.Json;
                    
public class Program
{
    public static void Main()
    {
        Dictionary<TimeOnly, string> dict = new()
        {
            { new TimeOnly(10, 30, 20), "aaa" },
            { new TimeOnly(10, 40, 35), "bbb" }
        };
        var json = JsonConvert.SerializeObject(dict);
        Console.WriteLine(json);
        
        var dict2 = JsonConvert.DeserializeObject<Dictionary<TimeOnly, string>>(json);      
        foreach (var kv in dict2)
        {
            Console.WriteLine("{0:hh\\:mm\\:ss}: {1}", kv.Key, kv.Value);
        }
    }
}
Code
1
2
3
{"10:30:20":"aaa","10:40:35":"bbb"}
10:30:20: aaa
10:40:35: bbb
Добавлено через 1 минуту
Как видно, даже конвертера не нужно.
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 10:32  [ТС]
Это на NetCore 6+?
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 10:36
Цитата Сообщение от Alt56 Посмотреть сообщение
Это на NetCore 6+?
NET 7, там указано.
Для того, чтобы проверить на NET Framework 4.8, как у вас, надо бы знать, что за пакет вы скачали.
0
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 11:15  [ТС]
,Проверь плиз этот же код
структуры
https://www.nuget.org/packages... teTimeOnly

Json
https://www.nuget.org/packages/Newtonsoft.Json/
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.07.2023, 11:41
Лучший ответ Сообщение было отмечено Alt56 как решение

Решение

Цитата Сообщение от Alt56 Посмотреть сообщение
Проверь плиз этот же код
Студия сейчас недоступна, поэтому могу проверить только в онлайн-компиляторе. А этот онлайн-компилятор не даёт вызвать TimeOnly.ToString("hh:mm:ss") так как не доверяет полностью этой сборке. Если же использовать вывод по умолчанию, то выводит время в формате 10:30 AM, то есть в американской локализации. Назад же это время не парсит, что мне представляется недоделками в пакете.

Короче, я бы не парился, а использовал обычный System.TimeSpan для времени.
1
0 / 0 / 0
Регистрация: 23.03.2016
Сообщений: 71
05.07.2023, 11:49  [ТС]
Будем значит обходить как то, в любом случае спасибо за помощь
0
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
05.07.2023, 15:11
Можно так, используя NuGet пакет Newtonsoft.Json:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using Newtonsoft.Json;
 
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
 
namespace TimeToJson
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string json = JsonConvert.SerializeObject(DateTime.Now.ToString("dd.MM.yyyy HH:mm"), Formatting.Indented);
            File.WriteAllText(@"D:\dt.json", json, Encoding.UTF8);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string jsondata = File.ReadAllText(@"D:\dt.json", Encoding.UTF8);
            DateTime dt = JsonConvert.DeserializeObject<DateTime>(jsondata);
            MessageBox.Show(dt.ToString("dd.MM.yyyy HH:mm"));
        }
    }
}
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
08.07.2023, 08:08
Alt56, а ты кастомный TimeOnlyJsonConverter указывал хоть при сериализации?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2023, 08:08
Помогаю со студенческими работами здесь

Десериализация JSON
Как для такого формата класс создать? , , ] исп. Newtonsoft.Json var myclass =...

Десериализация JSON в Dictionary
Всем здраствуйте, имеется JSON примерно такого формата (всё, что под точками одинаковое для всех полей): &quot;tanks&quot;: Как мне...

Не работает десериализация JSON
У меня есть класс Doctor который принимает значение: public class Doctor { public string doctorsId { get; set; } ...

Десериализация Newtonsoft.Json
Возникла жизненная необходимость сохранять текущее состояние с возможностью снова восстановиться к нему. В моём коде происходит...

System.Text.Json десериализация
Необходимо преобразовать из jSon в объект и дальше работать с этими данными. Думаю проблема либо в описании класса либо в неверном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru