Как преобразовать следующую строку JSON в словарь C#

#c# #json

#c# #json

Вопрос:

Я пытаюсь преобразовать следующую строку ответа JSON в словарь C #<строка,строка>

 {
  {
  "type": "Select",
  "name": "timezone",
  "label": "Timezone",
  "description": "Select the city closest to you that shares your same timezone.",
  "multiOptions": {
    "US/Pacific": "(UTC-8) Pacific Time (US amp; Canada)",
    "US/Mountain": "(UTC-7) Mountain Time (US amp; Canada)",
    "US/Central": "(UTC-6) Central Time (US amp; Canada)",
    "US/Eastern": "(UTC-5) Eastern Time (US amp; Canada)",
    "America/Halifax": "(UTC-4)  Atlantic Time (Canada)",
    "America/Anchorage": "(UTC-9)  Alaska (US amp; Canada)",
    "Pacific/Honolulu": "(UTC-10) Hawaii (US)",
    "Pacific/Samoa": "(UTC-11) Midway Island, Samoa",
    "Etc/GMT-12": "(UTC-12) Eniwetok, Kwajalein",
    "Canada/Newfoundland": "(UTC-3:30) Canada/Newfoundland",
    "America/Buenos_Aires": "(UTC-3) Brasilia, Buenos Aires, Georgetown",
    "Atlantic/South_Georgia": "(UTC-2) Mid-Atlantic",
    "Atlantic/Azores": "(UTC-1) Azores, Cape Verde Is.",
    "Europe/London": "Greenwich Mean Time (Lisbon, London)",
    "Europe/Berlin": "(UTC 1) Amsterdam, Berlin, Paris, Rome, Madrid",
    "Europe/Athens": "(UTC 2) Athens, Helsinki, Istanbul, Cairo, E. Europe",
    "Europe/Moscow": "(UTC 3) Baghdad, Kuwait, Nairobi, Moscow",
    "Iran": "(UTC 3:30) Tehran",
    "Asia/Dubai": "(UTC 4) Abu Dhabi, Kazan, Muscat",
    "Asia/Kabul": "(UTC 4:30) Kabul",
    "Asia/Yekaterinburg": "(UTC 5) Islamabad, Karachi, Tashkent",
    "Asia/Calcutta": "(UTC 5:30) Bombay, Calcutta, New Delhi",
    "Asia/Katmandu": "(UTC 5:45) Nepal",
    "Asia/Omsk": "(UTC 6) Almaty, Dhaka",
    "India/Cocos": "(UTC 6:30) Cocos Islands, Yangon",
    "Asia/Krasnoyarsk": "(UTC 7) Bangkok, Jakarta, Hanoi",
    "Asia/Hong_Kong": "(UTC 8) Beijing, Hong Kong, Singapore, Taipei",
    "Asia/Tokyo": "(UTC 9) Tokyo, Osaka, Sapporto, Seoul, Yakutsk",
    "Australia/Adelaide": "(UTC 9:30) Adelaide, Darwin",
    "Australia/Sydney": "(UTC 10) Brisbane, Melbourne, Sydney, Guam",
    "Asia/Magadan": "(UTC 11) Magadan, Soloman Is., New Caledonia",
    "Pacific/Auckland": "(UTC 12) Fiji, Kamchatka, Marshall Is., Wellington"
  }
}
 

Используя библиотеку Newtonsoft JSON, я не могу понять, как это сделать. Используя онлайн-конвертеры, он создает класс с именем MulteOptions, а затем помещает все это в качестве свойств.

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

1. Я не понимаю, как ваш JSON может быть преобразован в a Dictionary<string,string> . Какая строка будет соответствовать ключу multiOptions ? т. Е. Какую строку я получу, если получу доступ jsonDict["multiOptions"] ?

2. Вот мой мыслительный процесс, и не стесняйтесь говорить мне, что я сумасшедший или это просто невозможно сделать: возьмите все эти пары ключ / значение под multeOptions: { , и удалите запятые в конце, и измените двоеточия на запятые … а затем добавьте в словарь? Имеет ли это смысл? Я не уверен, правильно ли я это объясняю

3. Вы просто хотите преобразовать все в multiOptions a Dictionary<string, string> и игнорировать такие вещи, как type , name и label ?

4. Да, пожалуйста! Это то, что я ищу.

5. Вы вставили недопустимый json. Исправьте это.

Ответ №1:

Вы можете предоставить Newtonsoft DTO для десериализации.

 var parsedDto = JsonConvert.DeserializeObject<ParsedJsonResponseDto>(jsonResponse);
 

Где объект DTO выглядит примерно так.

 public class ParsedJsonResponseDto
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("multiOptions")]
    public Dictionary<string, string> MultiOptions { get; set; }    
}
 

Теперь, когда у вас есть объект со своим словарем MULTIPTIONS, вы можете выполнять итерации по своему усмотрению.

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

1. Когда я делаю это, я получаю InvalidCastException @knowonecanknow

Ответ №2:

Да, это возможно, вам нужно использовать System.Отражение

 public Root MyDeserializedClass = new Root();
public Dictionary<string, string> MyDictionary = new Dictionary<string, string>();
...
private void Button_Clicked_1(object sender, EventArgs e)
{
   ConvertToDictionaryPair();
}

private void ConvertToDictionaryPair()
{
   PropertyInfo[] properties = MyDeserializedClass.multiOptions.GetType().GetProperties();
   foreach (PropertyInfo property in properties)
   {
       string key = property.Name;
       string value = property.GetValue(MyDeserializedClass.multiOptions).ToString();
       if (!MyDictionary.ContainsKey(key))
           MyDictionary.Add(key, value);
   }
}
 

Модель

 public class Root
    {
        public string type { get; set; }
        public string name { get; set; }
        public string label { get; set; }
        public string description { get; set; }
        public MultiOptions multiOptions { get; set; }
    }

    public class MultiOptions
    {
        [JsonProperty("US/Pacific")]
        public string USPacific { get; set; }
        [JsonProperty("US/Mountain")]
        public string USMountain { get; set; }
        [JsonProperty("US/Central")]
        public string USCentral { get; set; }
        [JsonProperty("US/Eastern")]
        public string USEastern { get; set; }
        [JsonProperty("America/Halifax")]
        public string AmericaHalifax { get; set; }
        [JsonProperty("America/Anchorage")]
        public string AmericaAnchorage { get; set; }
        [JsonProperty("Pacific/Honolulu")]
        public string PacificHonolulu { get; set; }
        [JsonProperty("Pacific/Samoa")]
        public string PacificSamoa { get; set; }
        [JsonProperty("Etc/GMT-12")]
        public string EtcGMT12 { get; set; }
        [JsonProperty("Canada/Newfoundland")]
        public string CanadaNewfoundland { get; set; }
        [JsonProperty("America/Buenos_Aires")]
        public string AmericaBuenosAires { get; set; }
        [JsonProperty("Atlantic/South_Georgia")]
        public string AtlanticSouthGeorgia { get; set; }
        [JsonProperty("Atlantic/Azores")]
        public string AtlanticAzores { get; set; }
        [JsonProperty("Europe/London")]
        public string EuropeLondon { get; set; }
        [JsonProperty("Europe/Berlin")]
        public string EuropeBerlin { get; set; }
        [JsonProperty("Europe/Athens")]
        public string EuropeAthens { get; set; }
        [JsonProperty("Europe/Moscow")]
        public string EuropeMoscow { get; set; }
        public string Iran { get; set; }
        [JsonProperty("Asia/Dubai")]
        public string AsiaDubai { get; set; }
        [JsonProperty("Asia/Kabul")]
        public string AsiaKabul { get; set; }
        [JsonProperty("Asia/Yekaterinburg")]
        public string AsiaYekaterinburg { get; set; }
        [JsonProperty("Asia/Calcutta")]
        public string AsiaCalcutta { get; set; }
        [JsonProperty("Asia/Katmandu")]
        public string AsiaKatmandu { get; set; }
        [JsonProperty("Asia/Omsk")]
        public string AsiaOmsk { get; set; }
        [JsonProperty("India/Cocos")]
        public string IndiaCocos { get; set; }
        [JsonProperty("Asia/Krasnoyarsk")]
        public string AsiaKrasnoyarsk { get; set; }
        [JsonProperty("Asia/Hong_Kong")]
        public string AsiaHongKong { get; set; }
        [JsonProperty("Asia/Tokyo")]
        public string AsiaTokyo { get; set; }
        [JsonProperty("Australia/Adelaide")]
        public string AustraliaAdelaide { get; set; }
        [JsonProperty("Australia/Sydney")]
        public string AustraliaSydney { get; set; }
        [JsonProperty("Asia/Magadan")]
        public string AsiaMagadan { get; set; }
        [JsonProperty("Pacific/Auckland")]
        public string PacificAuckland { get; set; }
    }
 

Сначала нажмите «Получить данные» и заполните модель, затем нажмите «Установить данные», выполните итерацию по модели и добавьте имя и значение каждого свойства в словарь.

Скриншот

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

1. Почему xaml? Почему графический интерфейс, почему http? Вопрос о десериализации json.

2. я знаю, просто я не знал опыта (поскольку они являются новым участником) человека, задающего вопрос, поэтому я просто скопировал весь поток, если и когда они примут / ответят на него, я сокращу его @AlexanderPetrov