#c# #json #.net #parsing #dotnet-httpclient
Вопрос:
У меня здесь есть фрагмент JSON, взятый из HttpClient
класса ниже в программе C# .NET 5.
Упрощенный JSON:
{
"Restaurants":
[
{
"Id": 138898,
"Name": "Willesborough Cafe",
"Rating": {
"Count": 76,
"Average": 5.92,
"StarRating": 5.92
},
"CuisineTypes": [
{
"Id": 92,
"IsTopCuisine": false,
"Name": "Breakfast",
"SeoName": "breakfast"
}, {
"Id": 106,
"IsTopCuisine": true,
"Name": "British",
"SeoName": "british"
}
],
"Cuisines": [
{
"Name": "Breakfast",
"SeoName": "breakfast"
}, {
"Name": "British",
"SeoName": "british"
}
]
}
]
}
Текущий код:
dynamic result =
await _httpClient.GetFromJsonAsync<dynamic>(url);
// dynamic result2 = JsonConvert.DeserializeObject<dynamic>(result); // slow
dynamic result2 = JObject.Parse(result); // slow
Мне интересно получить информацию из каждого ресторана ниже из Restaurants
массива:
- Имя
- Оценка
- Тип интерфейса
Я использую dynamic
, так как мне не нужно создавать несколько классов на основе структуры JSON, и мне не нужно менять свой класс, если структура JSON изменится.
Я пробовал JsonConvert.DeserializeObject
amp; JObject.Parse
.
Однако отладка Visual Studio застряла в любом из методов на очень длительный период
Каков рекомендуемый метод получения частичных свойств из огромного ответа JSON?
Спасибо
Комментарии:
1. Если вспомогательных методов вам недостаточно, то единственным другим вариантом было бы использовать
JsonReader
для ручного чтения JSON и извлечения нужных вам битов, пропуская остальные и не тратя на них дополнительное время обработки. Возможно, это тоже будет недостаточно быстро для ваших нужд, но это самый быстрый способ сделать это.2. Это не должно быть так медленно, возможно, задержка вызвана тем, что он ждет результата запроса.
3. @anastaciu, я мог видеть
result
значение сразу после_httpClient.GetFromJsonAsync
запуска. Почему он ждет запроса, пока я могу видеть значение?4. Задержитесь:
GetFromJsonAsync
в вашем примере уже возвращается десериализованный объект. Почему же вы тогда пытаетесь его разобрать?5. Ну, я бы лично предпочел десериализовать его в классы, специально созданные для хранения данных JSON. JSON.NET просто десериализуется в
JObject
илиJArray
(в зависимости от исходных данных) под капотом при использованииdynamic
.
Ответ №1:
Вы можете создать класс с именованными свойствами
class Restaurant
{
public string Name { get; set; }
public Rating Rating { get; set; }
public List<CuisineType> CuisineTypes { get; set; }
}
class Rating
{
public int Count { get; set; }
public decimal Average { get; set; }
public decimal StarRating { get; set; }
}
class CuisineType
{
public int Id { get; set; }
public bool IsTopCuisine { get; set; }
public string Name { get; set; }
public string SeoName { get; set; }
}
и десериализуйте json в экземпляр ресторана, тогда у вас будет нужный вам тип. Это оно.
Вам нужен класс, содержащий список ресторанов, потому что у вас должно быть свойство, равное имени вашего объекта json
class RestaurantList { public List<Restaurant> Restaurants {get; set;} }
Теперь вам нужен код для привязки раздела json к объекту
var restaurants = JsonConvert.DeserializeObject<RestaurantList>(result);
Комментарии:
1. Можете ли вы привести пример десериализации с помощью вашего кода? Будут ли другие свойства в JSON отброшены во время десериализации?
2. Вам нужен класс, содержащий список ресторанов, потому что у вас должно быть свойство, равное имени с вашим классом объектов json RestaurantList { общедоступный список<Ресторан> Рестораны {get; set;} } Теперь вам нужен код для привязки раздела json к объекту var рестораны = JsonConvert. Десериализацияобъект<Список ресторанов>(результат);