2012-11-12 50 views
1

我有我想提取的以下json響應。我從來沒有使用過json概念.Just想知道如何使用DataContractJsonSerializer提取下面的json響應,以便我可以提取長名稱,短名稱或任何其他級別的屬性。如何在windows phone中提取json響應?

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

我寫犯規返回元素值的代碼:

 var ms = new MemoryStream(Encoding.Unicode.GetBytes(e.Result)); 
     DataContractJsonSerializer stdserialize = new DataContractJsonSerializer(typeof(Address)); 
     Address stuser = (Address)stdserialize.ReadObject(ms); 


    //############################################################################################################################ 
    [DataContract] 
    public class Address 
    { 
     [DataMember(Name = "long_name")] 
     public string address1; 
     [DataMember(Name = "short_name")] 
     public string shortaddress; 
     [DataMember(Name = "formatted_address")] 
     public string formattedtaddress; 
     [DataMember(Name = "lat")] 
     public string latitude; 
     [DataMember(Name = "long")] 
     public string latitude; 
    } 
    //############################################################################################################################## 
    [DataContract] 
    public class result 
    { 
     [DataMember(Name = "results")] 
     public string totalResult { get; set; } 
     [DataMember(Name = "address_components")] 
     public Dictionary<string, Address> merchants { get; set; } 
    } 
//################################################################################################################### 

任何幫助將不勝感激。

回答

2

首先,我建議使用Json.net進行反序列化,它易於使用,具有WP版本並且比DataContractJsonSerializer快很多倍 - 請參閱http://json.codeplex.com/

另外,請嘗試瀏覽器插件,例如Pretty Json for Chrome(https://chrome.google.com/webstore/detail/pretty-json/ddngkjbldiejbheifcmnfmmfiniimbbg),這樣在訪問時可以更輕鬆地閱讀json結構瀏覽器中的json網址。

如果你確實堅持使用DataContractJsonSerializer,那你就是在正確的軌道上。你只需要將你的類匹配到Json的結構(該插件將幫助你)。最外層的對象包含地址的列表和文字的狀態:

[DataContract] 
public class Result 
{ 
    [DataMember(Name = "status")] 
    public string Status { get; set; } 

    [DataMember(Name = "results")] 
    public Address[] Results { get; set; } 
} 

然後每個地址的對象是這樣的:

[DataContract] 
public class Address 
{ 
    [DataMember(Name = "formatted_address")] 
    public string FormattedAddress; 

    [DataMember(Name = "address_components")] 
    public AddressComponent[] AddressComponents; 
} 

他們有看起來像地址組件列表:

[DataContract] 
public class AddressComponent 
{ 
    [DataMember(Name = "long_name")] 
    public string LongName; 

    [DataMember(Name = "short_name")] 
    public string ShortName; 

    [DataMember(Name = "types")] 
    public string Types; 
} 

要包括長/拉,你必須有另一個類作爲其另一個關卡,例如幾何 - >位置。

然後,您可以反序列化到最外部的對象,像這樣:

var ms = new MemoryStream(Encoding.Unicode.GetBytes(e.Result)); 
    DataContractJsonSerializer stdserialize = new DataContractJsonSerializer(typeof(Result)); 
    Result res = (Result)stdserialize.ReadObject(ms); 

然後你可以看一下res.Results要經過的每個地址

+0

感謝您reply.I我能夠提取的結果now.I也從codeplex獲得了json.nets文件到我的本地機器。我現在可以如何使用它?我需要從json.net代碼文件中引用任何dll嗎? – krrishna

+1

是的,你會做。儘管如此,最簡單的方法是在Visual Studio中安裝NuGet(http://nuget.org/)作爲擴展,然後將引用添加到Json.net中 –