2013-08-02 6 views
2

Я думал, что могу просто создать быстрый класс и использовать JSON.Net для десериализации результата, и это отчасти работает, но я думаю, что вдуваю его в свою структуру классов:Проанализируйте API-интерфейсы Google Maps Geocode с помощью Json.Net

public class Location 
    { 
     public string lat { get; set; } 
     public string lng { get; set; } 
    } 

    public class Geometry 
    { 
     public Location location { get; set; } 
    } 

    public class Json 
    { 
     public Results results { get; set; } 
    } 

    public class Results 
    { 
     public Json json { get; set; } 
     public Geometry geometry { get; set; } 
    } 

    public class Query 
    { 
     public Results results { get; set; } 
    } 

    public class RootObject 
    { 
     public Query query { get; set; } 
    } 

Вот пример того, что получить вернулся из Google:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "1600", 
       "short_name" : "1600", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Amphitheatre Parkway", 
       "short_name" : "Amphitheatre Pkwy", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Mountain View", 
       "short_name" : "Mountain View", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Santa Clara", 
       "short_name" : "Santa Clara", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "California", 
       "short_name" : "CA", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "94043", 
       "short_name" : "94043", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA", 
     "geometry" : { 
      "location" : { 
       "lat" : 37.42244920, 
       "lng" : -122.08506440 
      }, 
      "location_type" : "ROOFTOP", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 37.42379818029150, 
        "lng" : -122.0837154197085 
       }, 
       "southwest" : { 
        "lat" : 37.42110021970850, 
        "lng" : -122.0864133802915 
       } 
      } 
     }, 
     "types" : [ "street_address" ] 
     } 
    ], 
    "status" : "OK" 
} 

я пропускаю просто здесь я знаю, кто-нибудь?

+1

'Это своего рода работа, но я думаю, что я дую в своей классной структуре'. Что это значит? что не работает? Какая у вас ошибка? – I4V

+0

@ I4V Я думаю, что он имеет в виду, что он получает только некоторые данные, когда он десериализует, а другие поля, вероятно, являются нулевыми. Это произойдет, если структура класса не соответствует JSON, как это, очевидно, здесь. –

+1

@BrianRogers Я вижу это из вашего ответа. Но не лучше ли, если нам не нужно будет догадываться, в чем проблема? – I4V

ответ

5

Попробуйте использовать json2csharp.com, чтобы сгенерировать ваши классы. Используя этот инструмент, классовая структура выходит так:

public class AddressComponent 
{ 
    public string long_name { get; set; } 
    public string short_name { get; set; } 
    public List<string> types { get; set; } 
} 

public class Location 
{ 
    public double lat { get; set; } 
    public double lng { get; set; } 
} 

public class Northeast 
{ 
    public double lat { get; set; } 
    public double lng { get; set; } 
} 

public class Southwest 
{ 
    public double lat { get; set; } 
    public double lng { get; set; } 
} 

public class Viewport 
{ 
    public Northeast northeast { get; set; } 
    public Southwest southwest { get; set; } 
} 

public class Geometry 
{ 
    public Location location { get; set; } 
    public string location_type { get; set; } 
    public Viewport viewport { get; set; } 
} 

public class Result 
{ 
    public List<AddressComponent> address_components { get; set; } 
    public string formatted_address { get; set; } 
    public Geometry geometry { get; set; } 
    public List<string> types { get; set; } 
} 

public class RootObject 
{ 
    public List<Result> results { get; set; } 
    public string status { get; set; } 
} 

Обратите внимание, что вы можете simiplify это немного: сгенерированные Northeast и Southwest классов идентичны Location, так что вы можете заменить их Location, где они используются внутри класса Viewport.

0

В новых версиях Visual Studio вы можете выбрать Edit > Paste Special > Paste JSON as Classes для создания своих классов.

Вот результат создан с последней версией Google Maps API, returned JSON example:

public class Rootobject 
{ 
    public Result[] results { get; set; } 
    public string status { get; set; } 
} 

public class Result 
{ 
    public Address_Components[] address_components { get; set; } 
    public string formatted_address { get; set; } 
    public Geometry geometry { get; set; } 
    public string place_id { get; set; } 
    public string[] types { get; set; } 
} 

public class Geometry 
{ 
    public Location location { get; set; } 
    public string location_type { get; set; } 
    public Viewport viewport { get; set; } 
} 

public class Location 
{ 
    public float lat { get; set; } 
    public float lng { get; set; } 
} 

public class Viewport 
{ 
    public Northeast northeast { get; set; } 
    public Southwest southwest { get; set; } 
} 

public class Northeast 
{ 
    public float lat { get; set; } 
    public float lng { get; set; } 
} 

public class Southwest 
{ 
    public float lat { get; set; } 
    public float lng { get; set; } 
} 

public class Address_Components 
{ 
    public string long_name { get; set; } 
    public string short_name { get; set; } 
    public string[] types { get; set; } 
} 

Вы можете переименовать Rootobject к тому, что вам нужно, чтобы это было.

Существует также опция XML в том же меню для выполнения того же действия с XML.

Смежные вопросы