Member 10536462 Ответов: 5

Десериализация C# JSON


{ "Описание": "этот реестр определяет события для процессора управления.",
"Идентификатор": "События.в JSON",
"Сообщения": {
"AEPSecureEraseFailed": {
"Описание": "безопасное стирание постоянной памяти Intel Optane DC не удалось.",
"Сообщение": "безопасное удаление" Интел " Optane постоянной памяти В постоянного тока не",
"ParamTypes": ["string", "string", "string"],
"Разрешение": "Повторите Попытку Безопасного Стирания. Пожалуйста, обратитесь в службу поддержки HPE, если проблема не устранена.",
"Серьезность": "Критическая"
},
"AdapterConfigurationChange": {
"Описание": "указанный адаптер претерпел изменение конфигурации.",
"Сообщение": "адаптер в слоте %1 претерпел изменение конфигурации.",
"Резолюция": "Нет",
"Серьезность": "Хорошо"
},
"FanRemoved": {
"Описание": "вентилятор снят.",
"Сообщение": "вентилятор удален.",
"Резолюция": "Нет",
"Серьезность": "Предупреждение"
}
},
"Имя": "Реестр Событий"
}

Что я уже пробовал:

публичный класс AEPSecureEraseFailed
{
публичное строковое описание { get; set; }
публичное строковое сообщение { get; set; }
публичный список<string> ParamTypes { get; set; }
разрешение публичной строки { get; set; }
публичная строгость строки { get; set; }
}

публичный класс AdapterConfigurationChange
{
публичное строковое описание { get; set; }
публичное строковое сообщение { get; set; }
разрешение публичной строки { get; set; }
публичная строгость строки { get; set; }
}

общественный класс FanRemoved
{
публичное строковое описание { get; set; }
публичное строковое сообщение { get; set; }
разрешение публичной строки { get; set; }
публичная строгость строки { get; set; }
}

сообщения публичного класса
{
public AEPSecureEraseFailed AEPSecureEraseFailed { get; set; }
AdapterConfigurationChange публичных AdapterConfigurationChange { получить; набор; }
общественные FanRemoved FanRemoved { получить; набор; }
}

публичный класс RootObject
{
публичное строковое описание { get; set; }
public string Id { get; set; }
публичные сообщения Messages { get; set; }
public string Name { get; set; }
}

Есть ли какой-либо другой способ десериализации, кроме как:
сообщения публичного класса
{
public AEPSecureEraseFailed AEPSecureEraseFailed { get; set; }
AdapterConfigurationChange публичных AdapterConfigurationChange { получить; набор; }
общественные FanRemoved FanRemoved { получить; набор; }
}
так что нам не нужно писать те же строки для других 256 левых событий

5 Ответов

Рейтинг:
40

TheRealSteveJudge

Я хотел бы порекомендовать вам
json2csharp - генерация классов c# из json[^]
Этот сайт будет генерировать Класс C# из любой допустимой строки JSON.
Нет необходимости писать соответствующий класс C# вручную.


Рейтинг:
2

phil.o

Json.NET[^] также может быть полезным.


Рейтинг:
2

Richard Deeming

Поскольку все сообщения, похоже, имеют общий набор свойств, попробуйте сделать что-то вроде этого:

public class ErrorMessage
{
    public string Description { get; set; }
    public string Message { get; set; }
    public string Resolution { get; set; }
    public string Severity { get; set; }
    
    // Add any other interesting properties from the different messages here.
    // Any which are not available for this message will be null.
    public List<string> ParamTypes { get; set; }
}

public class RootObject
{
    public string Description { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
    public Dictionary<string, ErrorMessage> Messages { get; set; }
}


Рейтинг:
1

RmcbainTheThird

Скопируйте строку json в буфер обмена, а затем в меню Правка в visual studio выберите пункт вставить специальный.


phil.o

Это операция расчетного времени. Требования OP, похоже, происходят во время выполнения.

RmcbainTheThird

Ой надо научиться читать гудер

Рейтинг:
0

Graeme_Grant

Поскольку вы начинаете с сериализации данных JSON, эта статья отвечает на этот вопрос и многие другие, которые у вас будут: Работа с JSON в C# и VB[^]