Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Здравствуйте!

Есть такой код, который сериализирует объекты в JSON в файл.
+C#
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace jsontest
{
    [DataContract]
    class Data_Color
    {
        [DataMember]
        public DataColors[,] Colors { get; set; }
        [DataMember]
        public Int32 Marker { get; set; }

        private readonly Random rnd = new Random(DateTime.Now.Millisecond);

        public Data_Color(Int32 width, Int32 height)
        {
            this.Colors = new DataColors[width, height];

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    this.Colors[i, j] = new DataColors();

                    this.Colors[i, j].ColorR = rnd.Next(0, 255);
                    this.Colors[i, j].ColorG = rnd.Next(0, 255);
                    this.Colors[i, j].ColorG = rnd.Next(0, 255);
                }
            }

            this.Marker = rnd.Next(0, 10);
        }

        public class DataColors
        {
            public Int32 ColorR { get; set; }
            public Int32 ColorG { get; set; }
            public Int32 ColorB { get; set; }            
        }        
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<Data_Color> dataList = new List<Data_Color>();
            Int32 Width = 6;
            Int32 Height = 6;

            dataList.Add(new Data_Color(Width, Height));
            dataList.Add(new Data_Color(Width, Height));
            dataList.Add(new Data_Color(Width, Height));

            string pathjson = "C:\\Users\\Acer\\Desktop\\ColorTest.json";

            var jsonFormatter = new DataContractJsonSerializer(typeof(List<Data_Color>));

            using (var file = new FileStream(pathjson, FileMode.OpenOrCreate))
            {
                jsonFormatter.WriteObject(file, dataList);
            }

            Console.ReadKey();
        }
    }
}
В выделенной строке выдаёт ошибку Сообщение = Многомерные массивы не поддерживаются.

Скажите, как это можно обойти?
2 фев 21, 21:09    [22273486]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
hVostt
Member

Откуда:
Сообщений: 19144
ferzmikk,

Как вы в JSON видите двухмерный массив? Покажите.
3 фев 21, 00:04    [22273541]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
hVostt
ferzmikk,

Как вы в JSON видите двухмерный массив? Покажите.

Теоретически так
+
[
    {'Colors': [
                    [
                        {'ColorR': 221, 'ColorG': 226, 'ColorB': 245,  'ColorGrayscale': 226, },
                        {'ColorR': 218, 'ColorG': 224, 'ColorB': 240,  'ColorGrayscale': 224, }
                    ],
                    [
                        {'ColorR': 221, 'ColorG': 226, 'ColorB': 245,  'ColorGrayscale': 226, },
                        {'ColorR': 218, 'ColorG': 224, 'ColorB': 240,  'ColorGrayscale': 224, }
                    ]
               ],
    'Marker': 1},
    {'Colors': [
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244, 'ColorGrayscale': 225, },
                        {'ColorR': 221, 'ColorG': 226, 'ColorB': 245, 'ColorGrayscale': 226, }
                    ],
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244, 'ColorGrayscale': 225, },
                        {'ColorR': 221, 'ColorG': 226, 'ColorB': 245, 'ColorGrayscale': 226, }
                    ]
                ],
    'Marker': 2},
    {'Colors': [
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, },
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, }
                    ],
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, },
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, }
                    ]
               ],
    'Marker': 3},
    {'Colors': [
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, },
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, }
                    ],
                    [
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, },
                        {'ColorR': 220, 'ColorG': 225, 'ColorB': 244,  'ColorGrayscale': 225, }
                    ]
           ],
    'Marker': 1}
]
3 фев 21, 14:10    [22273858]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
ferzmikk
Теоретически так

Это не двумерный массив, а массив массивов. Сделай массив массивов и будет тебе так же
3 фев 21, 14:37    [22273896]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Пробую делать через массив массивов
+C#
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace jsontest
{
    [DataContract]
    class Data_Color
    {
        [DataMember]
        public List<List<DataColors>> Colors { get; set; }
        [DataMember]
        public Int32 Marker { get; set; }

        private readonly Random rnd = new Random(DateTime.Now.Millisecond);

        public Data_Color(Int32 width, Int32 height)
        {
            this.Colors = new List<List<DataColors>>();

            for (int i = 0; i < width; i++)
            {
                var dim = new List<DataColors>();

                for (int j = 0; j < height; j++)
                {
                    var data = new DataColors();

                    data.ColorR = rnd.Next(0, 255);
                    data.ColorG = rnd.Next(0, 255);
                    data.ColorB = rnd.Next(0, 255);

                    dim.Add(data);
                }

                Colors.Add(dim);
            }

            this.Marker = rnd.Next(0, 10);
        }

        public class DataColors
        {
            public Int32 ColorR { get; set; }
            public Int32 ColorG { get; set; }
            public Int32 ColorB { get; set; }
        }       
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<Data_Color> dataList = new List<Data_Color>();
            Int32 Width = 6;
            Int32 Height = 6;

            dataList.Add(new Data_Color(Width, Height));
            dataList.Add(new Data_Color(Width, Height));
            dataList.Add(new Data_Color(Width, Height));

            string pathjson = "C:\\Users\\Acer\\Desktop\\ColorTest.json";

            var jsonFormatter = new DataContractJsonSerializer(typeof(List<Data_Color>));

            using (var file = new FileStream(pathjson, FileMode.OpenOrCreate))
            {
                jsonFormatter.WriteObject(file, dataList);
            }

            Console.ReadKey();
        }
    }
}
Выдает сообщение:
System.Runtime.Serialization.InvalidDataContractException: "Тип "jsontest.Data_Color+DataColors" не может быть сериализован. Пометьте его с помощью атрибута DataContractAttribute, а также пометьте все его члены, которые необходимо сериализовать, с помощью атрибута DataMemberAttribute. Если этот тип является коллекцией, пометьте его атрибутом CollectionDataContractAttribute.
3 фев 21, 20:33    [22274333]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
ferzmikk
System.Runtime.Serialization.InvalidDataContractException: "Тип "jsontest.Data_Color+DataColors" не может быть сериализован. Пометьте его с помощью атрибута DataContractAttribute, а также пометьте все его члены, которые необходимо сериализовать, с помощью атрибута DataMemberAttribute. Если этот тип является коллекцией, пометьте его атрибутом CollectionDataContractAttribute.
и?
4 фев 21, 09:47    [22274475]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Shocker.Pro
и?
Не понятно как дальше код писать. Атрибуты указаны. Над классом указывать как CollectionDataContract получается некорректно. Для DataListList атрибут CollectionDataMember не существует.
4 фев 21, 10:08    [22274485]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4159
а класса отсутствует конструктор по умолчанию, как вы его десериализовывать будите?
в C# есть куча сериализаторов Json, многим из которых вообще плевать на атрибуты
4 фев 21, 10:28    [22274501]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4159
Roman Mejtes, *будете
4 фев 21, 11:53    [22274568]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2246
ferzmikk,

У тебя data_colors никто не знает как в жсон завернуть походу. А еще color должен быть uint8. 16 байт на цвет тебе не нужно.

Сообщение было отредактировано: 4 фев 21, 11:52
4 фев 21, 11:58    [22274578]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
ferzmikk
Атрибуты указаны
Где? У тебя класс DataColors без атрибутов вообще
4 фев 21, 12:23    [22274600]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
        [DataContract]
        public class DataColors
        {
            [DataMember]
            public Int32 ColorR { get; set; }
            [DataMember]
            public Int32 ColorG { get; set; }
            [DataMember]
            public Int32 ColorB { get; set; }
        }

Теперь работает.
4 фев 21, 12:53    [22274630]     Ответить | Цитировать Сообщить модератору
 Re: JSON. Многомерные массивы не поддерживаются  [new]
ferzmikk
Member

Откуда:
Сообщений: 2213
Спасибо!
4 фев 21, 14:56    [22274758]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить