2013-10-03 2 views
2

Я использую Bing Map REST API, потому что хочу узнать геолокацию из секретного местоположения. Url отлично работает, но из-за того, что я использую код JSON в первый раз, я действительно не знаю, как я получаю вывод, который я хочу.Анализ кода JSON из Bing Map API в C#

Я попытался следующие:

string URL = "http://dev.virtualearth.net/REST/v1/Locations?countryRegion=&adminDistrict=&locality=Wien&postalCode=&addressLine=&userLocation=&userIp=&usermapView=&includeNeighborhood=&maxResults=&key=MY_KEY"; 
WebClient client = new WebClient(); 
client.OpenReadAsync(new Uri(URL, UriKind.Absolute)); 
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 

private void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Point)); 
    Point data = serializer.ReadObject(e.Result) as Point; 
} 

[DataContract] 
public class Point 
{ 
    /// <summary> 
    /// Latitude,Longitude 
    /// </summary> 
    [DataMember(Name = "coordinates")] 
    public double[] Coordinates { get; set; } 
} 

Когда я печатаю на ссылку в браузере, это мой ответ:

{ "authenticationResultCode": "ValidCredentials", "brandLogoUri":» http://dev.virtualearth.net/Branding/logo_powered_by.png","copyright":"Копия авторских прав © 2013 Microsoft и ее поставщики. Все права защищены. Этот API недоступен, и контент и любые результаты могут не использоваться , воспроизводится или передается любым способом без письменного разрешения корпорации Microsoft. "," resourceSets ": [{" estimatedTotal ": 1," ресурсы ": [{" __type ":" Расположение: Http: //schemas.microsoft.com/search/local/ws/rest/v1" , "BBOX": [+47,253395080566406, -123.16571807861328,47.946159362792969 , -121.50344085693359], «name»: «Seattle, WA», «point»: {«type»: «Point», «maps»: [47.603561401367188, -122.32943725585938]}, «address»: {"adminDistrict": " WA »,« adminDistrict2 »:« King Co. »,« CountryRegion »:« Соединенные Штаты »,« formattedAddress »:« Сиэтл, WA »,« местность »:« Сиэтл »},« уверенность »:« Высокий », EntityType ":" PopulatedPlace», "geocodePoints": [{ "тип": "Точка", "координата": [47.603561401367188, -122.32943725585938], "calculationMethod": "Крыша", "usageTypes": [ "Display"]} ], "matchCodes": [ "Хорошо"]}]}], "StatusCode": 200, "statusDescription": "OK", "traceId": "08bee37ecb714d7cb7e2783eb8f873a4 | LTSM000177 | 02.00.183.2300 | LTSIPEVM000039"}

Мой вопрос сейчас: это правильный способ сделать это? И как мне получить данные?

Надеюсь, вы можете мне помочь, я уже потратил много времени на эту проблему.

----- EDIT -----

Теперь я использую Json.NET, но я не знаю, как анализировать данные, я получаю от веб-сайта в строковой переменной.

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

var json = new WebClient().DownloadString("url"); 

, но это не работает, потому что я занимаюсь разработкой на Windows Phone.

System.Net.WebClient не содержит определение для "DownloadString" ...

Любой человек может помочь мне получить эту работу для Windows Phone Apps.

ответ

4

При работе с JSON, я предпочитаю Json.Net.После объявления необходимых классов, этот код всех

var root = JsonConvert.DeserializeObject<RootObject>(json); 

foreach (var rs in root.resourceSets) 
{ 
    foreach (var r in rs.resources) 
    { 
     Console.WriteLine(r.point.coordinates[0] + " , " + r.point.coordinates[1]); 
    } 
} 

Вы можете использовать this site для преобразования JSON к конкретным классам

public class Point 
{ 
    public string type { get; set; } 
    public List<double> coordinates { get; set; } 
} 

public class Address 
{ 
    public string adminDistrict { get; set; } 
    public string adminDistrict2 { get; set; } 
    public string countryRegion { get; set; } 
    public string formattedAddress { get; set; } 
    public string locality { get; set; } 
} 

public class GeocodePoint 
{ 
    public string type { get; set; } 
    public List<double> coordinates { get; set; } 
    public string calculationMethod { get; set; } 
    public List<string> usageTypes { get; set; } 
} 

public class Resource 
{ 
    public string __type { get; set; } 
    public List<double> bbox { get; set; } 
    public string name { get; set; } 
    public Point point { get; set; } 
    public Address address { get; set; } 
    public string confidence { get; set; } 
    public string entityType { get; set; } 
    public List<GeocodePoint> geocodePoints { get; set; } 
    public List<string> matchCodes { get; set; } 
} 

public class ResourceSet 
{ 
    public int estimatedTotal { get; set; } 
    public List<Resource> resources { get; set; } 
} 

public class RootObject 
{ 
    public string authenticationResultCode { get; set; } 
    public string brandLogoUri { get; set; } 
    public string copyright { get; set; } 
    public List<ResourceSet> resourceSets { get; set; } 
    public int statusCode { get; set; } 
    public string statusDescription { get; set; } 
    public string traceId { get; set; } 
} 

Json.net также позволяет использовать ключевое слово dynamic без объявления какого-либо из эти классы.

dynamic root = JsonConvert.DeserializeObject(json); 

foreach (var rs in root.resourceSets) 
{ 
    foreach (var r in rs.resources) 
    { 
     Console.WriteLine(r.point.coordinates[0] + " , " + r.point.coordinates[1]); 
    } 
} 
+0

спасибо, это кажется очень приятным, я буду тестировать его завтра – Crusader633

+0

var root = JsonConvert.DeserializeObject (json); могу ли я дать ссылку в качестве параметра? – Crusader633

2

Вы можете использовать http://json2csharp.com/ для создания пользовательского класса. Включите его в код проекта. После этого используйте тот же DataContractJsonSerializer с новым CustomClass.

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(CustomClass)); 
CustomClass data = serializer.ReadObject(e.Result); 

Если вы используете VS2012 у вас есть инструменты: http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc.aspx

3

Вы можете использовать сериализатор/десериализатор Microsoft JSON.

Если вы не работаете с ASP.NET, вам необходимо включить ссылки System.Web и System.Web.Extensions;

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); 
Dictionary<string, object> json = (object[])javaScriptSerializer.DeserializeObject(text); 

Вам не нужно отобразить его в набор классов или структур, массивы будут преобразованы в объект [] и объекты будут преобразованы в словарь.

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

Например, чтобы получить доступ к brandLogoUri вам просто нужно

(string)json["brandLogoUri"] 

Чтобы петля в resourceSets, что это массив, вам нужно сделать следующее

foreach(Dictionary<string,object> key in (Dictionary<string,object>)json["resourceSets"]) 
{ 
...do your stuff here... 
} 

Obiviously ваш код будет менее читаемым , но это полезно, если сложно сопоставить json с классами или если вы хотите сделать некоторые тесты «на лету»

+0

спасибо, но как мне получить json из URL-адреса в строку. Это моя главная проблема. Описано в моем редактировании. – Crusader633

+2

Извините, я пропустил редактирование. Вы должны использовать «асинхронную» версию метода. WebClient webClient = новый WebClient(); webClient.DownloadStringCompleted + = (отправитель, e) => { ... разобрать ваш json здесь ... }; webClient.DownloadStringAsync (новый Uri («... ваш uri здесь ...»)); Я не тестировал его напрямую, но он должен работать. http://msdn.microsoft.com/en-us/library/system.net.downloadstringcompletedeventargs.aspx –

+0

PS: не использовать JSON.net У меня были некоторые странные проблемы, декодирующие json содержащие объекты с помощью только числовых клавиш, например. {«a»: {1: «привет», 2: «мир», 3: «!» }} (я не тестировал последнюю версию) –

1

Я ЗНАЮ, ЧТО ВЫ ИСПОЛЬЗУЕТЕ БИНГОВЫЕ КАРТЫ, Но вот googl а также:

Запрос и анализ API Карт Google. Отклик на C#, изменение json в URL-адресе на xml и использование следующего кода для преобразования результата в полезный объект списка C#.

var url = String.Format("http://maps.googleapis.com/maps/api/directions/xml?..."); 
var result = new System.Net.WebClient().DownloadString(url); 
var doc = XDocument.Load(new StringReader(result)); 

var DirectionsResponse = doc.Elements("DirectionsResponse").Select(l => new 
{ 
    Status = l.Elements("status").Select(q => q.Value).FirstOrDefault(), 
    Route = l.Descendants("route").Select(n => new 
    { 
     Summary = n.Elements("summary").Select(q => q.Value).FirstOrDefault(), 
     Leg = n.Elements("leg").ToList().Select(o => new 
     { 
      Step = o.Elements("step").Select(p => new 
      { 
       Travel_Mode = p.Elements("travel_mode").Select(q => q.Value).FirstOrDefault(), 
       Start_Location = p.Elements("start_location").Select(q => new 
       { 
        Lat = q.Elements("lat").Select(r => r.Value).FirstOrDefault(), 
        Lng = q.Elements("lng").Select(r => r.Value).FirstOrDefault() 
       }).FirstOrDefault(), 
       End_Location = p.Elements("end_location").Select(q => new 
       { 
        Lat = q.Elements("lat").Select(r => r.Value).FirstOrDefault(), 
        Lng = q.Elements("lng").Select(r => r.Value).FirstOrDefault() 
       }).FirstOrDefault(), 
       Polyline = p.Elements("polyline").Select(q => new 
       { 
        Points = q.Elements("points").Select(r => r.Value).FirstOrDefault() 
       }).FirstOrDefault(), 
       Duration = p.Elements("duration").Select(q => new 
       { 
        Value = q.Elements("value").Select(r => r.Value).FirstOrDefault(), 
        Text = q.Elements("text").Select(r => r.Value).FirstOrDefault(), 
       }).FirstOrDefault(), 
       Html_Instructions = p.Elements("html_instructions").Select(q => q.Value).FirstOrDefault(), 
       Distance = p.Elements("distance").Select(q => new 
       { 
        Value = q.Elements("value").Select(r => r.Value).FirstOrDefault(), 
        Text = q.Elements("text").Select(r => r.Value).FirstOrDefault(), 
       }).FirstOrDefault() 
      }).ToList(), 
      Duration = o.Elements("duration").Select(p => new 
      { 
       Value = p.Elements("value").Select(q => q.Value).FirstOrDefault(), 
       Text = p.Elements("text").Select(q => q.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
      Distance = o.Elements("distance").Select(p => new 
      { 
       Value = p.Elements("value").Select(q => q.Value).FirstOrDefault(), 
       Text = p.Elements("text").Select(q => q.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
      Start_Location = o.Elements("start_location").Select(p => new 
      { 
       Lat = p.Elements("lat").Select(q => q.Value).FirstOrDefault(), 
       Lng = p.Elements("lng").Select(q => q.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
      End_Location = o.Elements("end_location").Select(p => new 
      { 
       Lat = p.Elements("lat").Select(q => q.Value).FirstOrDefault(), 
       Lng = p.Elements("lng").Select(q => q.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
      Start_Address = o.Elements("start_address").Select(q => q.Value).FirstOrDefault(), 
      End_Address = o.Elements("end_address").Select(q => q.Value).FirstOrDefault() 
     }).ToList(), 
     Copyrights = n.Elements("copyrights").Select(q => q.Value).FirstOrDefault(), 
     Overview_polyline = n.Elements("overview_polyline").Select(q => new 
     { 
      Points = q.Elements("points").Select(r => r.Value).FirstOrDefault() 
     }).FirstOrDefault(), 
     Waypoint_Index = n.Elements("waypoint_index").Select(o => o.Value).ToList(), 
     Bounds = n.Elements("bounds").Select(q => new 
     { 
      SouthWest = q.Elements("southwest").Select(r => new 
      { 
       Lat = r.Elements("lat").Select(s => s.Value).FirstOrDefault(), 
       Lng = r.Elements("lng").Select(s => s.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
      NorthEast = q.Elements("northeast").Select(r => new 
      { 
       Lat = r.Elements("lat").Select(s => s.Value).FirstOrDefault(), 
       Lng = r.Elements("lng").Select(s => s.Value).FirstOrDefault() 
      }).FirstOrDefault(), 
     }).FirstOrDefault() 
    }).FirstOrDefault() 
}).FirstOrDefault(); 

Надеюсь, это поможет кому-то.

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