Как десериализовать ответ полученный с сайта?
Написал следующий метод:
public async Task GetBrandAutoAsync(CancellationToken cancellationToken = default)
{
using (var request = new HttpRequestMessage(HttpMethod.Get, "https://katavto.ru/all_marks_new.php"))
{
using (var response = await _httpClient.SendAsync(request, cancellationToken))
{
using (var sr = new StreamReader(await response.Content.ReadAsStreamAsync(), Encoding.GetEncoding("iso-8859-1")))
{
string s = sr.ReadToEnd();
var result = JsonSerializer.Deserialize<Data>(s);
}
}
}
}
Как мне переменную string контент полученный с сайта дессериализовать в Data
public class Data
{
public IList<Brand> Brands { get; set; }
}
public class Brand
{
public long Id { get; set; }
public string Name { get; set; }
public string AltName { get; set; }
}
В данной реализации Result всегда null
{"data":[{"id":"1100003","name":"Audi","alt_name":"audi","icon":"audi.jpg"},{"id":"1101746","name":"BMW","alt_name":"bmw","icon":""},{"id":"1103907","name":"Mercedes-Benz","alt_name":"mercedes-benz","icon":"mers.jpg"},{"id":"1106599","name":"Acura","alt_name":"acura","icon":""},{"id":"1106642","name":"Alfa Romeo","alt_name":"alfa-romeo","icon":""},{"id":"1106797","name":"Alpina","alt_name":"alpina","icon":""},{"id":"1106880","name":"Alpine","alt_name":"alpine","icon":""},{"id":"1106882","name":"Aston Martin","alt_name":"aston-martin","icon":""},{"id":"1106972","name":"Aurus","alt_name":"aurus","icon":""},{"id":"1106974","name":"Bentley","alt_name":"bentley","icon":""},{"id":"1107038","name":"Brilliance","alt_name":"brilliance","icon":""},{"id":"1107106","name":"Bugatti","alt_name":"bugatti","icon":""},{"id":"1107111","name":"BYD","alt_name":"byd","icon":""},{"id":"1107149","name":"Cadillac","alt_name":"cadillac","icon":""},{"id":"1107304","name":"Changan","alt_name":"changan","icon":""},{"id":"1107337","name":"Chery","alt_name":"chery","icon":""},{"id":"1107436","name":"CheryExeed","alt_name":"cheryexeed","icon":""},{"id":"1107437","name":"Chevrolet","alt_name":"chevrolet","icon":"chevrolet.jpg"},{"id":"1109554","name":"Chrysler","alt_name":"chrysler","icon":""},{"id":"1109671","name":"Citroen","alt_name":"citroen","icon":""},{"id":"1110224","name":"Dacia","alt_name":"dacia","icon":""},{"id":"1110340","name":"Dadi","alt_name":"dadi","icon":""},{"id":"1110341","name":"Daewoo","alt_name":"daewoo","icon":""},{"id":"1110503","name":"Daihatsu","alt_name":"daihatsu","icon":""},{"id":"1110683","name":"Datsun","alt_name":"datsun","icon":""},{"id":"1110694","name":"Dodge","alt_name":"dodge","icon":""},{"id":"1110949","name":"DongFeng","alt_name":"dongfeng","icon":""},{"id":"1110973","name":"DS","alt_name":"ds","icon":""},{"id":"1111023","name":"DW Hower","alt_name":"dw-hower","icon":""},{"id":"1111027","name":"FAW","alt_name":"faw","icon":""},{"id":"1111077","name":"Ferrari","alt_name":"ferrari","icon":""},{"id":"1111126","name":"Fiat","alt_name":"fiat","icon":""},{"id":"1111540","name":"Ford","alt_name":"ford","icon":""},{"id":"1113112","name":"Geely","alt_name":"geely","icon":""},{"id":"1113186","name":"Genesis","alt_name":"genesis","icon":""},{"id":"1113229","name":"GMC","alt_name":"gmc","icon":""},{"id":"1113340","name":"Great Wall","alt_name":"great-wall","icon":""},{"id":"1113427","name":"Haima","alt_name":"haima","icon":""},{"id":"1113452","name":"Haval","alt_name":"haval","icon":""},{"id":"1113483","name":"Honda","alt_name":"honda","icon":""},{"id":"1114128","name":"Hummer","alt_name":"hummer","icon":""},{"id":"1114148","name":"Hyundai","alt_name":"hyundai","icon":"handay.jpg"},{"id":"1115183","name":"Infiniti","alt_name":"infiniti","icon":""},{"id":"1115354","name":"Isuzu","alt_name":"isuzu","icon":""},{"id":"1115412","name":"JAC","alt_name":"jac","icon":""},{"id":"1115478","name":"Jaguar","alt_name":"jaguar","icon":""},{"id":"1115768","name":"Jeep","alt_name":"jeep","icon":""},{"id":"1115940","name":"JMC","alt_name":"jmc","icon":""},{"id":"1115949","name":"Kia","alt_name":"kia","icon":""},{"id":"1116946","name":"Koenigsegg","alt_name":"koenigsegg","icon":""},{"id":"1116955","name":"Lamborghini","alt_name":"lamborghini","icon":""},{"id":"1117007","name":"Land Rover","alt_name":"land-rover","icon":""},{"id":"1117197","name":"Lexus","alt_name":"lexus","icon":""},{"id":"1117367","name":"Lifan","alt_name":"lifan","icon":""},{"id":"1117411","name":"Ligier","alt_name":"ligier","icon":""},{"id":"1117412","name":"Lincoln","alt_name":"lincoln","icon":""},{"id":"1117454","name":"Lotus","alt_name":"lotus","icon":""},{"id":"1117472","name":"Maserati","alt_name":"maserati","icon":""},{"id":"1117521","name":"Maybach","alt_name":"maybach","icon":""},{"id":"1117528","name":"Mazda","alt_name":"mazda","icon":""},{"id":"1118397","name":"McLaren","alt_name":"mclaren","icon":""},{"id":"1118407","name":"Mini","alt_name":"mini","icon":""},{"id":"1118585","name":"Mitsubishi","alt_name":"mitsubishi","icon":"mitsubisi.jpg"},{"id":"1119280","name":"Nissan","alt_name":"nissan","icon":"nissan.jpg"},{"id":"1120382","name":"Opel","alt_name":"opel","icon":""},{"id":"1121651","name":"Pagani","alt_name":"pagani","icon":""},{"id":"1121662","name":"Peugeot","alt_name":"peugeot","icon":""},{"id":"1122364","name":"Pontiac","alt_name":"pontiac","icon":""},{"id":"1122397","name":"Porsche","alt_name":"porsche","icon":""},{"id":"1122775","name":"RAM","alt_name":"ram","icon":""},{"id":"1122825","name":"Ravon","alt_name":"ravon","icon":""},{"id":"1122835","name":"Renault","alt_name":"renault","icon":"renault.jpg"},{"id":"1123765","name":"Rolls-Royce","alt_name":"rolls-royce","icon":""},{"id":"1123789","name":"Saab","alt_name":"saab","icon":""},{"id":"1124086","name":"Scion","alt_name":"scion","icon":""},{"id":"1124113","name":"SEAT","alt_name":"seat","icon":""},{"id":"1124622","name":"Skoda","alt_name":"skoda","icon":""},{"id":"1125667","name":"Smart","alt_name":"smart","icon":""},{"id":"1125718","name":"SsangYong","alt_name":"ssangyong","icon":""},{"id":"1125909","name":"Subaru","alt_name":"subaru","icon":""},{"id":"1126348","name":"Suzuki","alt_name":"suzuki","icon":""},{"id":"1126793","name":"Tesla","alt_name":"tesla","icon":""},{"id":"1126812","name":"Toyota","alt_name":"toyota","icon":"toyota.jpg"},{"id":"1128917","name":"Vauxhall","alt_name":"vauxhall","icon":""},{"id":"1129414","name":"Volkswagen","alt_name":"volkswagen","icon":"volkswagen.jpg"},{"id":"1131297","name":"Volvo","alt_name":"volvo","icon":""},{"id":"1131971","name":"Vortex","alt_name":"vortex","icon":""},{"id":"1131980","name":"Zotye","alt_name":"zotye","icon":""},{"id":"1131998","name":"ZX","alt_name":"zx","icon":""},{"id":"1132021","name":"\u0412\u0410\u0417 (Lada)","alt_name":"vaz-lada","icon":"vaz.jpg"},{"id":"1132070","name":"\u0422\u0430\u0433\u0410\u0417","alt_name":"tagaz","icon":""}]}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Нужно добавить опции, чтобы включить нечувствительную к регистру десереализацию
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
И немного пофиксить модель
public class BrandData
{
public Brand[] Data { get; set; }
}
public class Brand
{
public string Id { get; set; }
public string Name { get; set; }
public string Alt_Name { get; set; }
}
Или так
public class BrandData
{
[JsonPropertyName("data")]
public Brand[] Brands { get; set; }
}
public class Brand
{
public string Id { get; set; }
public string Name { get; set; }
[JsonPropertyName("alt_name")]
public string AltName { get; set; }
}
А сам метод можно упростить
public Task<BrandData> GetBrandAutoAsync(CancellationToken cancellationToken = default)
{
return _httpClient.GetFromJsonAsync<BrandData>("https://katavto.ru/all_marks_new.php", options, cancellationToken);
}
Откуда вы взяли вот это "iso-8859-1" - непонятно, потому что сервер отдает данные в кодировке UTF-8.
BrandData brandData = await GetBrandAutoAsync();
Так как сервер отдает ответ с ошибкой в HTTP заголовке.
content-type: application/x-javascript; charset=utf8
Должно быть utf-8, а не utf8. То метод придется немного обкостылить.
public async Task<BrandData> GetBrandAutoAsync(CancellationToken cancellationToken = default)
{
using Stream response = await _httpClient.GetStreamAsync("https://katavto.ru/all_marks_new.php", cancellationToken);
return await JsonSerializer.DeserializeAsync<BrandData>(response, options);
}
Либо как предложил @EvgeniyZ, создать своего провайдера кодировки и использовать первый вариант метода
public class CustomUtf8EncodingProvider : EncodingProvider
{
public override Encoding GetEncoding(string name) => name is "utf8" ? Encoding.UTF8 : null;
public override Encoding GetEncoding(int codepage) => null;
}
Encoding.RegisterProvider(new CustomUtf8EncodingProvider()); // выполнить 1 раз при запуске приложения