Lan Yung Lee Ответов: 1

Я хочу, чтобы преобразовать следующие завиток с ASP.NET с#


$ curl "https://tools.keycdn.com/geo.json?host={IP or hostname}"


Это завиток.
Это используется для получения местоположения пользователя по IP-адресу.
Однако я не знаю, как преобразовать это в asp.net C#.

Что я уже пробовал:

Я попробовал следующие коды:

public IPData GetIPGeoLocation(string IP)
       {
           WebClient client = new WebClient();
           // Make an api call and get response.
           try
           {
               string response client.DownloadString("https://tools.keycdn.com/geo.json?host={"+IP+"}");
               //Deserialize response JSON
               IPData ipdata = JsonConvert.DeserializeObject<IPData>(response);
               if (ipdata.status == "fail")
               {
                   throw new Exception("Invalid IP");
               }

               return ipdata;
           }
           catch (Exception)
           {
               throw;
           }
       }


       public class IPData
       {
           public string status { get; set; }
           public string country { get; set; }
           public string countryCode { get; set; }
           public string region { get; set; }
           public string regionName { get; set; }
           public string city { get; set; }
           public string zip { get; set; }
           public string lat { get; set; }
           public string lon { get; set; }
           public string timezone { get; set; }
           public string isp { get; set; }
           public string org { get; set; }
           public string @as { get; set; }
           public string query { get; set; }
       }


Есть ли что-то неправильное в этой части кода?

1 Ответов

Рейтинг:
2

David_Wimbley

Я не запускал ваш код, но думаю, что первым местом для начала будет ваш класс, к которому вы пытаетесь десериализовать ответ.

Я взял URL-адрес и получил json с самого сайта, и ваша структура выглядит неправильной. Я использовал json2csharp.com и получил следующее, что вы должны использовать при десериализации.

формат JSON

{
   "status":"success",
   "description":"Data successfully received.",
   "data":{
      "geo":{
         "host":"1.1.1.1",
         "ip":"1.1.1.1",
         "rdns":"hostname",
         "asn":"1111111",
         "isp":"ISP",
         "country_name":"United States",
         "country_code":"US",
         "region":"GA",
         "city":"Atlanta",
         "postal_code":"11111",
         "continent_code":"NA",
         "latitude":"11.1",
         "longitude":"-11.1",
         "dma_code":"111",
         "area_code":"111",
         "timezone":"America\/New_York",
         "datetime":"2017-07-25 21:37:30"
      }
   }
}


Какой класс будет соответствовать этому объекту

public class Geo
{
    public string host { get; set; }
    public string ip { get; set; }
    public string rdns { get; set; }
    public string asn { get; set; }
    public string isp { get; set; }
    public string country_name { get; set; }
    public string country_code { get; set; }
    public string region { get; set; }
    public string city { get; set; }
    public string postal_code { get; set; }
    public string continent_code { get; set; }
    public string latitude { get; set; }
    public string longitude { get; set; }
    public string dma_code { get; set; }
    public string area_code { get; set; }
    public string timezone { get; set; }
    public string datetime { get; set; }
}

public class Data
{
    public Geo geo { get; set; }
}

public class RootObject
{
    public string status { get; set; }
    public string description { get; set; }
    public Data data { get; set; }
}


Класс, который вы используете, будет ожидать, что возвращаемый json будет просто

{
   "status":"success",
   "description":"Data successfully received.",
	 "host":"1.1.1.1",
	 "ip":"1.1.1.1",
	 "rdns":"hostname",
	 "asn":"1111111",
	 "isp":"ISP",
	 "country_name":"United States",
	 "country_code":"US",
	 "region":"GA",
	 "city":"Atlanta",
	 "postal_code":"11111",
	 "continent_code":"NA",
	 "latitude":"11.1",
	 "longitude":"-11.1",
	 "dma_code":"111",
	 "area_code":"111",
	 "timezone":"America\/New_York",
	 "datetime":"2017-07-25 21:37:30"
}


и даже тогда некоторые метки, которые вы используете в своем классе, не совпадают с метками, возвращаемыми в json.

Но когда вы десериализуете свою строку в объект вместо IPData ipdata = JsonConvert.DeserializeObject<IPData>(response); вы бы сделали

RootObject ipdata = JsonConvert.DeserializeObject<RootObject>(response);

Поэтому я думаю, что если вы поменяете свои IP-данные с приведенной выше структурой классов, это может сработать, опять же я сам не запускал ваш код.