#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);
}
}