Как я могу проанализировать строку JSON, которая привела бы к незаконным идентификаторам C #?

#c# #json #json.net

#c# #json #json.net

Вопрос:

Я использую библиотеку NewtonSoft JSON Convert для анализа и преобразования строки JSON в объекты C #. Но теперь я наткнулся на действительно неудобную строку JSON, и я не могу преобразовать ее в объект C #, потому что я не могу создать класс C # из этой строки JSON.

Вот строка JSON

 {
"1": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:40"
},
"2": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:41"
 } 
}
  

Класс C #, необходимый для анализа этой строки JSON, должен быть таким:

 public class 1 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}

public class 2 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}
  

Но это не может быть настоящий класс C #, потому что мы знаем, что имена классов не могут начинаться с числа.

Было бы действительно здорово, если бы кто-нибудь мог предложить, как проанализировать такой тип строки json.

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

1. Ваша логика неверна. из того, что я вижу, у вас есть список элементов с одинаковой структурой. Итак, ваш класс должен представлять эту структуру, а НЕ список, и вы должны проанализировать свой JSON в список .NET, а не в несколько классов.

2. Как только это будет похоже на пары ключ-значение, приведенный ниже ответ будет правильным

3. Список @Bartdude или НЕ список?

4. Да, есть другой класс, который имеет два свойства, одно для класса 1, а другое для класса 2

5. Л.Б. здесь Андерс объяснил это гораздо более четко, чем я 🙂

Ответ №1:

Вы можете выполнить десериализацию в словарь.

 public class Item
{
    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}
  

 var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
  

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

1. огромное спасибо.. сработало как шарм ……проблема решена. но все же я не знаю, как это работает. не могли бы вы объяснить, как работает dictionary?

2. @TaLhaKhan Потому что ваш json представляет пары ключ-значение. «1» — это ключ, {...} это значение.

Ответ №2:

Хотя словарь является лучшим решением для конкретного случая, который у вас был, вопрос, который вы задали, также может быть истолкован как:

как мне десериализовать объекты с именами свойств, которые нельзя использовать в C #?

Например, что, если у вас

 {
    "0": "04:15",
    "zzz": "foo"
}
  

Решение: используйте аннотации:

 public class Item
{
   [JsonProperty("0")]
   public string AnyName { get; set; }

   [JsonProperty("zzz")]
   public string AnotherName { get; set; }
}
  

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

1. Конечно, если количество ключей и их имена известны заранее. Не подходит для динамически создаваемых объектов, таких как userid : {name:aa,surname:bb}, anotheruserid:{}

2. @I4V Если они являются динамически создаваемыми объектами, вы, вероятно, все равно не смогли бы использовать предопределенные классы.

3. @R0MANARMY Я не это имел в виду. Ключи могут быть динамическими, например, guid или идентификатор, поступающий из базы данных. Но его значение является известным типом. {{1232574:{name:john}, 755344674:{name:doe}}

Ответ №3:

Вы можете использовать эти расширения:

 public static class JsonExtensions
{
    public static Dictionary<string, T> ToObject<T>(this string json)
    {
        return JsonConvert.DeserializeObject<Dictionary<string, T>>(json);
    }

    public static string ToJson<T>(this T obj)
    {
        return JsonConvert.SerializeObject(obj);
    }
}