Помимо рекомендованного трюка от @Hirasawa, я считаю, что важно понимать, как все это работает, поэтому я хотел бы отметить пару глюков в вашем коде.
Вам не нужен класс Phone.
Если вы посмотрите на структуру данных, номер телефона является только свойством элемента результата. Кроме того, Results
является массивом, поэтому давайте обновим код, чтобы исправить эти ошибки:
public class Data247
{
Response response { get; set; }
public class Response
{
public string status { get; set; }
public Results[] results { get; set; }
public class Results
{
public string phone { get; set; }
public string wless { get; set; }
public string carrier_name { get; set; }
public string carrier_id { get; set; }
public string sms_address { get; set; }
public string mms_address { get; set; }
}
}
}
Целевые свойства должны быть опубликованы c.
В чтобы правильно десериализовать ответ, свойства в ваших целевых классах должны быть publi c. Исправляя эти ошибки, мы получаем:
public class Data247
{
public Response response { get; set; }
public class Response
{
public string status { get; set; }
public Results[] results { get; set; }
public class Results
{
public string phone { get; set; }
public string wless { get; set; }
public string carrier_name { get; set; }
public string carrier_id { get; set; }
public string sms_address { get; set; }
public string mms_address { get; set; }
}
}
}
С учетом вышеуказанных изменений код теперь работает. Ну, почти ;-). Получается, что теперь у нас есть вложенный класс Results
на том же уровне свойства с именем Results
. Это недопустимо в C#, и компилятор сообщит вам об этом с ошибкой: «Элемент Results уже объявлен.» .
Исправить несложно, мы просто перемещаем вложенные классы во внешнюю область видимости или можем переименовать классы Response
и Results
во что-то вроде ResponseDTO
и ResultDTO
, но я нахожу бывший проще сделать. Итак, теперь наш код:
public class Data247
{
public Response response { get; set; }
}
public class Response
{
public string status { get; set; }
public Results[] results { get; set; }
}
public class Results
{
public string phone { get; set; }
public string wless { get; set; }
public string carrier_name { get; set; }
public string carrier_id { get; set; }
public string sms_address { get; set; }
public string mms_address { get; set; }
}
БОНУС: Напишите код idiomati c C#.
Если вы хотите написать код idiomati c, Вы должны использовать рекомендуемые имена свойств. Это вопрос стиля и кода, как он работает, но C# разработчик поблагодарит вас, если ваш код написан правильно.
Это краткое резюме того, что я сделаю:
- Переименование имен свойств в
UpperCamelCase
формате. Например: mms_address
должно быть MmsAddress
. - . Из-за 1. мы также должны использовать атрибуты для сопоставления фактических имен свойств в json с именем свойства C#.
Ниже приведен окончательный код:
public class Data247
{
[JsonProperty("Response")]
public Response Response { get; set; }
}
public class Response
{
[JsonProperty("status")]
public string Status { get; set; }
[JsonProperty("results")]
public Results[] Results { get; set; }
}
public class Results
{
[JsonProperty("Phone")]
public string Phone { get; set; }
[JsonProperty("wless")]
public string Wless { get; set; }
[JsonProperty("carrier_name")]
public string CarrierName { get; set; }
[JsonProperty("carrier_id")]
public string CarrierId { get; set; }
[JsonProperty("sms_address")]
public string SmsAddress { get; set; }
[JsonProperty("mms_address")]
public string MmsAddress { get; set; }
}
Надеюсь, это поможет!