Представление класса C # для этого json

#c# #.net #asp.net-core #asp.net-core-2.0 #asp.net-core-3.1

#c# #.net #asp.net-core #asp.net-core-2.0 #asp.net-ядро-3.1

Вопрос:

Мне нужна небольшая помощь, чтобы создать класс C # для отображения ниже ответа json из FCM token info api (https://developers.google.com/instance-id/reference/server#get_information_about_app_instances ):

 {
   "application": "com.chrome.windows",
   "subtype": "wp:www.mydomain.com/#A1249A346-7458-45BB-A0F2-2AC4856BB-V2",
   "scope": "*",
   "authorizedEntity": "8212312155",
   "rel": {
      "topics": {
         "topic1": {
            "addDate": "2020-12-06"
         }
      }
   },
   "platform": "BROWSER"
}
 

Где topic1 — это не имя свойства, а значение, а темы, которые являются именем свойства, содержат список тем.

На самом деле я не уверен, как представлять темы в приведенном выше json.

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

1. public Dictionary<string, Topic> Topics {get;set;}

2. Меню вставки Visual Studio => Вставить специальное -> Вставить Json как классы

3. Если вы хотите улучшить именование свойств, вы можете изменить их по своему усмотрению и добавить [JsonProperty(«topic1»)] над свойством. Таким образом, вы не получите никаких ошибок при сериализации

Ответ №1:

Это формат словаря.

public Dictionary<string, Topic> Topics {get;set;}

Класс выглядит так, как показано ниже:

 public class Root
{
    public string application { get; set; }
    public string subtype { get; set; }
    public string scope { get; set; }
    public string authorizedEntity { get; set; }
    public Rel rel { get; set; }
    public string platform { get; set; }
}

public class Rel
{
    public Dictionary<string, Topic> topics { get; set; }
}

public class Topic
{
    public string addDate { get; set; }
}
 

Приведенный выше json может быть сериализован из приведенной ниже модели:

 var root = new Root
{
    application = "com.chrome.windows",
    subtype = "wp:www.mydomain.com/#A1249A346-7458-45BB-A0F2-2AC4856BB-V2",
    scope = "*",
    authorizedEntity = "8212312155",
    rel = new Rel
    {
        topics = new Dictionary<string, Topic>
        {
            { 
                "topic1", 
                new Topic
                { 
                    addDate = "2020-12-06" 
                }
            }
        }
    },
    platform = "BROWSER"
};
 

Ответ №2:

     public class Topic1    {
        public string addDate { get; set; } 
    }

    public class Topics    {
        public Topic1 topic1 { get; set; } 
    }

    public class Rel    {
        public Topics topics { get; set; } 
    }

    public class Root    {
        public string application { get; set; } 
        public string subtype { get; set; } 
        public string scope { get; set; } 
        public string authorizedEntity { get; set; } 
        public Rel rel { get; set; } 
        public string platform { get; set; } 
    }
 

https://json2csharp.com/

Если вы уверены, что разделы содержат уникальные имена разделов, поэтому используйте словарь, если не уверены, то перечислите

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

1. Разделы содержат уникальные имена разделов, но разделы могут содержать любое количество разделов. Итак, у нас не может быть класса, подобного Topic1

2. @Ivan Я проголосовал против.. Легко преобразовать некоторую заданную строку Json 1: 1 с помощью онлайн-инструментов, но это не отвечает на вопрос. Темы могут содержать несколько именованных элементов, которые не могут быть представлены напрямую. На самом деле для этого требуется словарь <строка,строка> элементов.. В нем будет одна запись для приведенной выше строки Json с ключом с именем «Topic1». Пол Майклс написал хороший учебник по разбору вашей строки Json и добавлению элементов словаря. для каждой из тем: pmichaels.net/2016/12/26 /…

3. Я понял, чего хочет Ахмед чуть позже 🙂 Конечно, было бы неплохо использовать dictionary, но у меня не было времени обновлять код. Итак, ваш минус один верен.