2012-08-15 63 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 - 无法字符串值分配给一个字符串变量

我工作了Windows Phone 7应用程序,我需要找到“城市名称”,从GPS以前进的坐标...

我在互联网上找到了上面的代码,并试过它。我可以通过使用这些代码(Message.Box(City)显示我想要的,城市名称)来查看城市名称。但是,这行代码

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

这给我城市名似乎给了一个易变的字符串值。

例如,我创建了一个方法,它将字符串变量“s”的值赋给我的类的名称City的字符串字段。如果我在调用FindCityName()方法后尝试获取城市的内容,我会看到City的内容没有更新。

再次发生同样的事情,然后我打电话的代码行的注释下“问题就在这里>>>>>”那MessageBox.Show(市)显示了无新意...

有人能解释我的理由我的问题?

回答

0

我会建议你使用这个谷歌地图API

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

而且一旦你在你的要求JSON响应。你可以用NEWTONSOFT轻松解析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添加到我的引用中... – 2012-08-17 10:57:25

1

你把这个问题放在我的博客上,但我会在这里回答。我觉得有点负责张贴在首位的示例代码;-)

我要承担包含你的代码的类看起来是这样的:

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

我通过在每个方法上使用断点并重新组织方法调用来解决问题。 非常感谢:) – 2012-08-19 15:22:54

+0

@LocalJoost我看到你的博客,它确实帮了我。我被困在与OP相同的问题上。谢谢!对于正在寻找博客的其他人,请点击此处 - http://dotnetbyexample.blogspot.gr/2012/01/json-deserialization-with-jsonnet.html – 2013-07-19 06:00:30

相关问题