Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032

Сериализация JSON

23.11.2022, 21:33. Показов 576. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть такой код:
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Json;
 
namespace ConsoleTest04
{
    class Program
    {
        static void Main(string[] args)
        {
            Series series = new Series(new DateTime(2021, 1, 1), new DateTime(2022, 1, 3));
 
            string pathjson = "C:\\Users\\Acer\\Desktop\\Series1.json";
 
            var jsonFormatter = new DataContractJsonSerializer(typeof(List<Series.yearData.element>));
 
            using (var file = new FileStream(pathjson, FileMode.OpenOrCreate))
            {
                //Здесь возникает ошибка: "Тип "Тип "ConsoleTest04.Series+yearData+element" не может быть сериализован.."
                jsonFormatter.WriteObject(file, series.List); 
            }
 
            Console.ReadLine();
        }
    }    
}

Появляется ошибка

Вот класс
Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
 
namespace ConsoleTest04
{
    [DataContract]
    class Series
    {
        [DataMember]
        public List<yearData> List { get; set; }
 
        public Series(DateTime startDateTime, DateTime endDateTime)
        {
            List = new List<yearData>();           
 
            int tempYear = startDateTime.Year;
 
            while (tempYear <= endDateTime.Year)
            {                
                List.Add(new yearData(tempYear));
                tempYear = tempYear + 1;
            }
        }
 
        public class yearData
        {
            public int year;
 
            public List<element> subList;
 
            public yearData(int year)
            {
                this.year = year;
 
                subList = new List<element>();
 
                var startDateTime = new DateTime(this.year, 1, 1);
                var endDateTime = new DateTime(this.year, 12, 31);
 
                var tempDateTime = startDateTime;
 
                while (tempDateTime.Date <= endDateTime.Date)
                {
                    var tempElement = new element();
                    tempElement.dateTime = tempDateTime;
 
                    subList.Add(tempElement);
 
                    tempDateTime = tempDateTime.AddDays(1);
                }
            }
 
            public class element
            {
                public DateTime dateTime { get; set; }
            }
        }
    }
}


Скажите, как правильно написать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2022, 21:33
Ответы с готовыми решениями:

Сериализация JSON
Привет! Прошу помощи, не могу понять, как собрать Json обратно. В общем изначально я получаю данные в таком виде: { ...

Сериализация в JSON
Добрый день. Прошерстил доки по сериализации JSON, нагугли несколько библиотек, но так и не смог сериализовать свою структуру. ...

Сериализация в json
Есть сервер-клиент, работает через асинхронные Udp сокеты, каждые 5 миллисекунд обмениваются информацией в формате json. Проблема в том,...

9
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
24.11.2022, 08:35  [ТС]
Правильно понимаю, что в классе надо добавить дополнительные атрибуты?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
24.11.2022, 09:07
MConst, сериализатор 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
public class DateTimeDataContractSurrogate : IDataContractSurrogate
    {
        private static readonly Regex dateRegex = new Regex(@"/Date\((\d+)([-+])(\d+)\)/");
        private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
 
        public object GetCustomDataToExport(Type clrType, Type dataContractType)
        {
            // not used
            return null;
        }
 
        public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
        {
            // not used
            return null;
        }
 
        public Type GetDataContractType(Type type)
        {
            // not used
            return type;
        }
 
        public object GetDeserializedObject(object obj, Type targetType)
        {
            // for debugging
            //Console.WriteLine("GetDeserializedObject: obj = {0} ({1}), targetType = {2}", obj, obj.GetType(), targetType);
 
            // only act on List<object> types
            if (obj.GetType() == typeof(List<object>))
            {
                var objList = (List<object>)obj;
 
                List<object> copyList = new List<object>(); // a list to copy values into. this will be the list returned.
                foreach (var item in objList)
                {
                    string s = item as string;
                    if (s != null)
                    {
                        // check if we match the DateTime format
                        Match match = dateRegex.Match(s);
                        if (match.Success)
                        {
                            // try to parse the string into a long. then create a datetime and convert to local time.
                            long msFromEpoch;
                            if (long.TryParse(match.Groups[1].Value, out msFromEpoch))
                            {
                                TimeSpan fromEpoch = TimeSpan.FromMilliseconds(msFromEpoch);
                                copyList.Add(TimeZoneInfo.ConvertTimeFromUtc(epoch.Add(fromEpoch), TimeZoneInfo.Local));
                                continue;
                            }
                        }
                    }
 
                    copyList.Add(item); // add unmodified
                }
 
                return copyList;
            }
 
            return obj;
        }
 
        public void GetKnownCustomDataTypes(System.Collections.ObjectModel.Collection<Type> customDataTypes)
        {
            // not used   
        }
 
        public object GetObjectToSerialize(object obj, Type targetType)
        {
            // for debugging
            //Console.WriteLine("GetObjectToSerialize: obj = {0} ({1}), targetType = {2}", obj, obj.GetType(), targetType);
            return obj;
        }
 
        public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
        {
            // not used
            return null;
        }
 
        public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
        {
            // not used
            return typeDeclaration;
        }
    }

И используйте его так
C#
1
var jsonFormatter = new DataContractJsonSerializer(typeof(List<Series.yearData.element>), null, int.MaxValue, false, new DateTimeDataContractSurrogate(), true);
Должно сработать

Добавлено через 3 минуты
MConst, И на всех типах которые будет участвовать в серилизации желательно добавлять атрибут [Serializable]
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
24.11.2022, 14:48  [ТС]
Цитата Сообщение от Andreyip Посмотреть сообщение
Должно сработать
Не работает
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
24.11.2022, 14:49
MConst, фреймворк какой?
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
24.11.2022, 14:57  [ТС]
Цитата Сообщение от Andreyip Посмотреть сообщение
MConst, фреймворк какой?
System.Runtime.Serialization. Версия 4.0.0.0
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
24.11.2022, 14:58
MConst, скинь сюда архив с проектом. А то непонятно на какой платформе ты проект собираешь
.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
27.11.2022, 17:54  [ТС]
Цитата Сообщение от Andreyip Посмотреть сообщение
MConst, скинь сюда архив с проектом. А то непонятно на какой платформе ты проект собираешь
.
ConsoleTest04.rar
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
27.11.2022, 18:19
MConst,
Я вам написал что нужно все классы которые вы хотите серилизовать пометить атрибутом [Serializable] вы же их зачем то пометили другим атрибутом DataContract
далее вы объявили серилизатор типа List<Series.yearData.element но при этом передаете в него series.List который имеет тип Series.yearData он вам и ругается на несоответствие типов. Посмотрите рабочий пример
ConsoleTest04.zip
1
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
27.11.2022, 19:02  [ТС]
Спасибо. Заработало. Теперь надо понять логику дополнительного класса DateTimeDataContractSurrogate. Учитывая, что в реальном примере в классе Series есть дополнительные поля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2022, 19:02
Помогаю со студенческими работами здесь

Сериализация в JSON
Добрый день столкнулся с проблемой у меня У меня есть структура public struct WindowSettings { public...

Сериализация JSON в C#
Доброго времени суток! Начал изучать сериализацию JSON и возникли некоторые недопонимания с моей стороны в плане изучения. Есть следующий...

Сериализация JSON
Здравствуйте! Допустим есть класс: public class Point2D { public double X, Y; private PluginStart Shell; public...

JSON сериализация в Key-Value
Здравствуйте. Есть слудующий json: { &quot;rates_scores_stats&quot;: , &quot;rates_statuses_stats&quot;: }

Сериализация/десериализация JSON
Всем привет. Имеется следующий Json документ: Скрин 1 Больше всего интересует и проводит в ступор...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru