0

Нужно создать класс, чтобы после сериализации он выглядел как в первом блоке кода. Как работать с json и xml я понимаю, вопрос в создании класса. Русский язык используется только для примера.

Требуется чтобы был один класс, в идеале. Для того чтобы его как один объект сериализовать.

{
  "Пользователь":{
    "Факультет": "Тестовый факультет",
    "Корпус": "Корпус тестового факультета",
    "Кабинет": "100",
    "Название кабинета": "Деканат тестового факультета",
    "Инвентарный номер": 00006969,
    "Используется для":[
      "Управление, организ. Уч. проц-в"
    ],
    "Подключен к интернету": "Да",
    "Подключен к мультимедиа": "Да",
    "Количество пользователей": 1,
    "ФИО пользователей":[
      "Павлов А.И."
    ],
    "Примечание": "Все работает"
  },
  "Компьютер":{
    "Имя компьютера": "COMPUTER",
    "Имя пользователя": "User",
    "Процессор": "Pentium(R) Dual-Core CPU E666 @ 3.33GHz",
    "Оперативная память": 4096,
    "Объем жестких дисков": 1006,
    "Видеокарта": "NVIDIA GeForce 710",
    "Операционная система": "Windows 8.1",
    "Устройства вывода изображения": "Универсальный монитор PnP",
    "Физические адреса": [
      "IPv4":[
        "192.168.73.1",
        "192.168.96.1"
      ],
      "IPv6":[
        "00:00:00:00:00:00:00:E0", 
        "00:00:00:00:00:00:00:E0"
      ],
      "MAC":[
        "0A:00:27:00:00:4C",
        "0A:00:27:00:00:4A"
      ]
    ]
  }
}

Как я примерно это вижу

SystemInfoContainer sic = new SystemInfoContainer();

sic.User.Faculty = "Тестовый факультет";

sic.Hardware.Username = "Username";

XmlSerializer xml = new XmlSerializer(typeof(SystemInfoContainer));

        using (FileStream fs = new FileStream("SystemInfo.xml", FileMode.OpenOrCreate))
        {
            xml.Serialize(fs, sic);
        }

Marbad
  • 21
  • 2
  • Ты на выходе хочешь такой json получить? Или это вход? – Ivan Khorin Feb 21 '21 at 12:39
  • Это то что должно выйти после сериализации – Marbad Feb 21 '21 at 12:40
  • Взять Json.Net написать класс и расставить атрибуты с русскими именами. – A K Feb 21 '21 at 12:50
  • Я и прошу помочь мне написать класс. Как работать с json я понимаю. – Marbad Feb 21 '21 at 12:58
  • Вот вам лучшая помощь: есть множество готовых сервисов, которые вам напишут по образцу json класс, посмотрите например этот: https://ru.stackoverflow.com/q/829895/213987 – A K Feb 21 '21 at 13:19
  • 2
    Вы допустили несколько ошибок при формировании данных 1) "Количество пользователей" - можно выкинуть, так как дальше идет их список и по количеству записей в нем можно определить количество. Данные дублировать нельзя. 2) "Физические адреса" - массив с массивами, среди которых физические адреса - только MAC. В общем, здесь синтаксическая ошибка, должен быть объект, а у вас массив. Должно быть "Физические адреса": {, то есть фигурная скобка, а не квадратная. 3) "Подключен к интернету": "Да" - почему не True/False? – aepot Feb 21 '21 at 13:26
  • На счет "количества пользователей" согласен, русский язык только для примера. – Marbad Feb 21 '21 at 13:38

2 Answers2

3
using System.Collections.Generic;
using System.IO;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;

namespace JsonSerializeExample
{
    public class Workplace
    {
        [JsonPropertyName("Пользователь")]
        public User User { get; set; }

        [JsonPropertyName("Компьютер")]
        public Computer Computer { get; set; }
    }

    public class User
    {
        [JsonPropertyName("Используется для")]
        public List<string> UsedFor { get; set; }
    }

    public class Computer
    {
        [JsonPropertyName("Имя компьютера")]
        public string Name { get; set; }
    }

    class Program
    {   
        static void Main(string[] args)
        {
            var workplace = new Workplace
            {
                User = new User
                {
                    UsedFor = new List<string> { "Управление, организ. Уч. проц-в" },
                },
                Computer = new Computer
                {
                    Name = "COMPUTER",
                },
            };

            var options = new JsonSerializerOptions
            { 
                WriteIndented = true, 
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
            };

            var json = JsonSerializer.Serialize(workplace, options);

            File.WriteAllText("workplace.json", json);        
        }
    }
}
{
  "Пользователь": {
    "Используется для": [
      "Управление, организ. Уч. проц-в"
    ]
  },
  "Компьютер": {
    "Имя компьютера": "COMPUTER"
  }
}

Остальное по образу и подобию :) P.S. Кириллица в именах свойств - зашквар, но надо - так надо :)

Ivan Khorin
  • 186
  • 3
0

Почитав несколько статей, просмотрев несколько видео вроде как теперь имею понятие как это сделать.

Спустя несколько часов, нашел вот этот прекрасный сайт https://json2csharp.com/.

Вот мой класс:

using System.Collections.Generic;

namespace JSONTest

{

public class SystemInfoContainer
{

    public User UserInfo { get; set; }

    public Computer HardwareInfo { get; set; }
}

public class User
{
    public string Faculty { get; set; }
    public string Corpus { get; set; }
    public string Cabinet { get; set; }
    public string CabinetName { get; set; }
    public string InventoryNumber { get; set; }
    public List&lt;string&gt; UsedFor { get; set; }
    public bool IsConnected { get; set; }
    public bool IsMultimedia { get; set; }
    public bool IsScienceDevices { get; set; }
    public List&lt;string&gt; UsersFullNames { get; set; }
    public string Additions { get; set; }
}

public class PhysAddr
{
    public IList&lt;string&gt; IPv4Addresses { get; set; }
    public IList&lt;string&gt; IPv6Addresses { get; set; }
    public IList&lt;string&gt; MACAddresses { get; set; }
}

public class Computer
{
    public string Name { get; set; }
    public string Userame { get; set; }
    public string Processor { get; set; }
    public int RAM { get; set; }
    public int HDD { get; set; }
    public string Videocard { get; set; }
    public string OS { get; set; }
    public string Output { get; set; }
    public IList&lt;PhysAddr&gt; PhysicalAddresses { get; set; }
}

}

Вот мой код для создания объекта:

SystemInfoContainer sysinf = new SystemInfoContainer();

sysinf.UserInfo = new User() { Faculty = "Тестовый факультет", Corpus = "Корпус тестового факультета", Cabinet = "100", CabinetName = "Деканат тестового факультета", InventoryNumber = "00006969", UsedFor = new List<string> { "Управление, организ. Уч. проц-в" }, IsConnected = true, IsMultimedia = true, IsScienceDevices = false, UsersFullNames = new List<string> { "Павлов А.И." }, Additions = "Все работает" };

sysinf.HardwareInfo = new Computer() { Name = "COMPUTER", Userame = "User", Processor = "Pentium(R) Dual-Core CPU E666 @ 3.33GHz", RAM = 4096, HDD = 1006, Videocard = "NVIDIA GeForce 710", OS = "Windows 8.1", Output = "Универсальный монитор PnP", PhysicalAddresses = new List<PhysAddr>() { new PhysAddr() { IPv4Addresses = new List<string>() { "192.168.73.1", "192.168.96.1" }, IPv6Addresses = new List<string>() { "00:00:00:00:00:00:00:E0", "00:00:00:00:00:00:00:E0" }, MACAddresses = new List<string>() { "0A:00:27:00:00:4C", "0A:00:27:00:00:4A" } } } };

Всем спасибо за советы и за первый ответ который помог мне понять как они работают.

Marbad
  • 21
  • 2