2012-08-15 4 views
0
public void FindCityName() 
     { 
      string url = "http://maps.google.com/maps/geo?q=39.920794,32.853902&output=json&oe=utf8&sensor=true&key=MYKEY"; 

      var w = new WebClient(); 
      Observable.FromEvent<DownloadStringCompletedEventArgs>(w, "DownloadStringCompleted").Subscribe(r => 
       { 
        var deserialized = JsonConvert.DeserializeObject<RootObject>(r.EventArgs.Result); 


        string s = deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName; 
/// setCity() and City=s produce the same thing 
        setCity(s); 
        City = s; 
        //foreach (var item in deserialized.Placemark) 
        //{ 
        // //MessageBox.Show(item.AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName); 
        // City = (string)item.AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName; 
        //} 
//Problem here >>>>> 
        ////MessageBox.Show(City); 
       }); 
      w.DownloadStringAsync(new Uri(url)); 
     } 

문제 :JsonConvert - 문자열 변수에 문자열 값을 할당 할 수 없습니다

나는 윈도우 폰 7 응용 프로그램에서 일하고 나는 GPS가 앞으로 이동하기 위해 좌표에서 "도시 이름"을 찾을 필요 ...

위의 코드를 인터넷에서 찾은 다음 시도해 보았습니다. 이 코드를 사용하여 도시 이름을 볼 수 있습니다 (Message.Box (City) 정확히 원하는 도시 이름 표시). 그러나 나에게 도시의 이름을 제공합니다 코드

deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName; 

이 라인은 휘발성 문자열 값을 줄 것으로 보인다.

예를 들어 문자열 변수 "s"의 값을 내 클래스의 문자열 필드 인 City에 할당하는 메서드를 만들었습니다. FindCityName() 메서드를 호출 한 후 City의 내용을 가져 오려고하면 City의 내용이 업데이트되지 않습니다.

가 다시 같은 일이 내가 코멘트에서 코드 라인을 호출 한 후 발생

은 누군가가 나에게 이유를 설명 할 수 ... 그 MessageBox.Show (시) 새로운 아무것도 보여주지 "여기에 문제 것은 >>>>>" 내 문제?

답변

0

난 당신이 구글지도 API를

http://maps.googleapis.com/maps/api/geocode/json?latlng=39.920794,32.853902&sensor=true

를 사용하는 것이 좋습니다 그리고 것입니다 귀하의 요청에 JSON 응답을 일단. 당신은 WP7

당신은뿐만 아니라 내 블로그에이 질문을 넣어
WebClient wc = new WebClient(); 
var json = (JObject)JsonConvert.DeserializeObject(wc.DownloadString(url)); 

var locality= json["results"] 
       .SelectMany(x => x["address_components"]) 
       .FirstOrDefault(t => t["types"].First().ToString() == "locality"); 

var name = locality!=null ? locality["long_name"].ToString() : ""; 
+0

WebClient wc에는 DownloadString (...)이라는 메서드가 없습니다. Newtonsoft.Json을 내 참조에 추가했습니다 ... –

1

에 대한 NEWTONSOFT 쉽게 분석 할 수 있지만, 난 여기가 대답한다. 내가 코드를 포함하는 클래스를 가정 할 것입니다

;-) 처음에 샘플 코드를 착용하는 약간 책임을 느낀다는 다음과 같습니다

문자열에 대한 휘발성 아무것도 없다
public class MyClass 
{ 
    private void MyMethod() 
    { 
     FindCityName(); 
     MessageBox.Show(City); 
    } 

    private void FindCityName() 
    { 
     // Code omitted - see your question 
    } 

    private string City; 
} 

. 문제가 비동기입니다. 주의 깊게 살펴보면 DownloadStringCompleted가 실행될 때 발생하는 관찰 가능 항목을 사용한다는 것을 알 수 있습니다. Observable.Event 내의 코드는 다운로드가 완료되면 으로 만 호출됩니다.하지만 비동기 적으로 발생합니다. 하지만 내가하는 일은 FindCityName 메서드를 호출 한 다음 MyMethod 메서드에 표시하는 것과 같이 결과에 직접 액세스하려고하는 것입니다. 이는 요청을 실행 한 후 결과를 직접 원하는 것과 같습니다. 결과는 아직 없습니다! 웹 페이지를 다운로드하는 것과 같습니다. 콜백으로 다음과 같이 수정할 수 있습니다.

public class MyClass 
{ 
    private void MyMethod() 
    { 
     FindName();  
    } 

    public void FindCityName() 
    { 
     string url = "http://maps.google.com/maps/geo?q=39.920794,32.853902&output=json&oe=utf8&sensor=true&key=MYKEY"; 

     var w = new WebClient(); 
     Observable.FromEvent<DownloadStringCompletedEventArgs>(w, "DownloadStringCompleted").Subscribe(r => 
      { 
       var deserialized = JsonConvert.DeserializeObject<RootObject>(r.EventArgs.Result); 

       City = deserialized.Placemark[0].AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName; 
       DoneDownloading(); 
      }); 
     w.DownloadStringAsync(new Uri(url)); 
    } 

    private string City; 

    private void DoneDownloading 
    { 
     MessageBox.Show(City); 
    } 
} 

도움이 될까요?

+0

모든 메서드에 중단 점을 사용하여 문제를 해결하고 내 메서드 호출을 다시 구성했습니다. 많은 감사합니다 :) –

+0

@LocalJoost 나는 당신의 블로그를 보았고 확실히 나를 도왔습니다. 나는 OP와 같은 문제에 갇혔다. 감사! 블로그를 찾는 다른 사용자의 경우 여기 (http://dotnetbyexample.blogspot.gr/2012/01/json-deserialization-with-jsonnet.html)를 참조하십시오. –

관련 문제