Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Помогите создать класс для JSON

#c_sharp #net #json #jsonnet


Мне приходит от сервера вот такой ответ:

 {
  "request.id" : null,
  "list" : {
   "email1@email.com" : {
     "Type" : "1"
  },
  "email2@email.com" : {
     "Type" : "1"
  },
  "email3@email.com" : {
     "Type" : "1"
  }
 }


Как и в какой класс мне его преобразовать при помощи библиотеки JSON.Net на C#? Учитывая,
что Email в List могут быть всегда разные.
    


Ответы

Ответ 1



Существуют несколько инструментов для генерации C# классов из JSON строки: http://json2csharp.com Если у вас установлено Web Essentials в Visual Studio, то выполните Edit > Paste special > paste JSON as class. Можно воспользоваться бесплатной программой jsonclassgenerator.exe Любой из этих инструментов на выходе дает классы, используемые для сериализации/десериализации JSON строки. Сам лично в большинстве случаем пользуюсь инструментом под номером 3. На выходе для вашего примера он дает следующие классы namespace Example { internal class SampleResponse1 { [JsonProperty("request.id")] public object RequestId { get; set; } [JsonProperty("list")] public List List { get; set; } } } namespace Example.SampleResponse1JsonTypes { internal class List { [JsonProperty("email1@email.com")] public Email1EmailCom Email1EmailCom { get; set; } [JsonProperty("email2@email.com")] public Email2EmailCom Email2EmailCom { get; set; } [JsonProperty("email3@email.com")] public Email3EmailCom Email3EmailCom { get; set; } } internal class Email1EmailCom { [JsonProperty("Type")] public string Type { get; set; } } internal class Email2EmailCom { [JsonProperty("Type")] public string Type { get; set; } } internal class Email3EmailCom { [JsonProperty("Type")] public string Type { get; set; } } } Учитывая, что Email в List могут быть всегда разные. В таком случае, для генерации С# классов ваш JSON должен модифицироваться в такой вид { "request.id" : null, "list" : [ { "email" : { Name: "email1@email.com", Type: "1" }, "email" : { Name: "email2@email.com", Type: "1" } }] } Иначе вы не сможете сгенерировать классы с переменным названием класса. Изменяемая часть не должна быть ключом JSON-объекта. Для генерации C# классов ключи JSON объектов должны быть фиксированными. Ключ содержит в себе название генерируемого класса. Либо нужно попробовать переписать этот пример через Dictionary. В итоге получился такой вариант. namespace Example { internal class SampleResponse1 { [JsonProperty("request.id")] public object RequestId { get; set; } [JsonProperty("list")] public Dictionary List { get; set; } } } namespace Example.SampleResponse1JsonTypes { class Email { [JsonProperty("type")] public string Type{ get; set; } } }

Ответ 2



Так как любой javascript объект можно представить в виде словаря, то класс может иметь следующий вид class SampleResponse1 { [JsonProperty("request.id")] public object RequestId { get; set; } [JsonProperty("list")] public Dictionary List { get; set; } } Где Email - это class Email{ public string Type{ get; set; } }

Ответ 3



Я вижу ещё следующие опции (ориентируясь на ещё более нетривиальные варианты, чем в вопросе): Так как объекты и свойства могут разными можно Сериализовать в ExpandoObject (по сути представляет словарь со свойствами), затем по нему итерируюсь посмотреть что за свойства. var expandoObject = JsonConvert.DeserializeObject(carPropertiesJson, new ExpandoObjectConverter()); Сгенерировать классы с помощью T4. Инструкции и руководства можно найти на MSDN: https://msdn.microsoft.com/en-us/library/ff697256.aspx https://msdn.microsoft.com/en-us/library/bb126478.aspx T4 является невероятно мощным инструментом, позволяющим также сгенерировать несколько файлов (причём любых расширений) и выполнять произвольный код.

Комментариев нет:

Отправить комментарий