2010-12-23 85 views
1

如何爲JSON Web服務結果創建類?這是我從google api得到的JSON結果。所以,如何爲這個JSON對象創建類和反序列化。 alt text如何在Windows Phone 7中爲JSON Web服務創建類?

我創建的類來反序列化這樣這個JSON對象,

string mapdetail = e.Result; 
     var djosn = new DataContractJsonSerializer(typeof(mapResult)); 
     var mstr = new MemoryStream(Encoding.UTF8.GetBytes(mapdetail)); 
     mapResult reslt = (mapResult)djosn.ReadObject(mstr); 

mapResult類:

[DataContract] 
public class mapResult 
{ 
    [DataMember] 
    public string status 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public IList<Resultdetail> result 
    { 
     get; 
     set; 
    } 
} 

所以我creadet對結果的細節和其他列表:

[DataContract] 
public class Resultdetail 
{ 
    [DataMember] 
    public List<string> types 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public string formatted_address 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public List<object> address_components 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public List<Geometry> geometry 
    { 
     get; 
     set; 
    } 

} 

[DataContract] 
public class Geometry 
{ 
    [DataMember] 
    public List<GeoLocation> location 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public string location_type 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public List<object> viewport 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public List<object> bounds 
    { 
     get; 
     set; 
    } 

} 

[DataContract] 
public class GeoLocation 
{ 
    [DataMember] 
    public double lat 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public double lng 
    { 
     get; 
     set; 
    } 

} 

現在我得到空引用;

alt text

+1

將來,請嘗試包含代碼(或json對象)的文本而不是圖片。這使得嘗試重新創建你正在做的事情變得更容易。 – 2010-12-23 12:01:22

回答

4

有你DatContract類的幾個問題。

我已經糾正了下面的這些,註釋掉了原始的行,並添加了關於具體錯誤的評論。

[DataContract] 
public class mapResult 
{ 
    [DataMember] 
    public string status { get; set; } 
    [DataMember] 
    //public IList<Resultdetail> result { get; set; } 
    // Misspelt property name and use of interface rather than concrete type 
    public List<Resultdetail> results { get; set; } 
} 

[DataContract] 
public class Resultdetail 
{ 
    [DataMember] 
    public List<string> types { get; set; } 
    [DataMember] 
    public string formatted_address { get; set; } 
    [DataMember] 
    public List<object> address_components { get; set; } 
    [DataMember] 
    //public List<Geometry> geometry { get; set; } 
    // Json does not contain an array/list of these 
    public Geometry geometry { get; set; } 
} 

[DataContract] 
public class Geometry 
{ 
    [DataMember] 
    //public List<GeoLocation> location { get; set; } 
    // Json does not contain an array/list of these 
    public GeoLocation location { get; set; } 
    [DataMember] 
    public string location_type { get; set; } 
    [DataMember] 
    // public List<object> viewport { get; set; } 
    // Json does not contain an array/list of these 
    public object viewport { get; set; } 
    [DataMember] 
    //public List<object> bounds { get; set; } 
    // Json does not contain an array/list of these 
    public object bounds { get; set; } 
} 

下面的代碼顯示了這個工程:

var jsonStr = "{\"status\": \"OK\", \"results\": [ { \"types\": [ \"route\" ], \"formatted_address\": \"7th Main Rd, Koramangala, sengaluru, Karnataka 560034, India\", \"address_components\": [ { \"long_name\": \"7th Main Rd\", \"short_name\": \"7th Main Rd\", \"types\": [ \"route\" ] }, { \"long_name\": \"Koramangala\", \"short_name\": \"Koramangala\", \"types\": [ \"sublocality\", \"political\" ] }, { \"long_name\": \"Bengaluru\", \"short_name\": \"Bengaluru\", \"types\": [ \"locality\", \"political\" ] }, { \"long_name\": \"sengaluru\", \"short_name\": \"sengaluru\", \"types\": [ \"administrative_area_level_2\", \"political\" ] }, { \"long_name\": \"Karnataka\", \"short_name\": \"Karnataka\", \"types\": [ \"administrative_area_level_1\", \"political\" ] }, { \"long_name\": \"India\", \"short_name\": \"IN\", \"types\": [ \"country\", \"political\" ] }, { \"long_name\": \"560034\", \"short_name\": \"560034\", \"types\": [ \"postal_code\" ] }],\"geometry\": { \"location\":{ \"lat\": 12.9259085, \"lng\": 77.6334715 }, \"location_type\": \"GEOMETRIC_CENTER\", \"viewport\": { \"southwest\": { \"lat\": 12.9227118, \"lng\": 77.6301852 }, \"northeast\": { \"lat\": 12.929007, \"lng\": 77.6364805}}, \"bounds\": { \"southwest\": { \"lat\": 12.9247615, \"lng\": 77.6330486 },\"northeast\": { \"lat\": 12.9269574, \"lng\": 77.6336171 }}}}]}"; 

// If using json.net (http://json.codeplex.com/) 
var des = JsonConvert.DeserializeObject<mapResult>(jsonStr); 

// If using System.Runtime.Serialization.Json 
var djosn = new DataContractJsonSerializer(typeof(mapResult)); 
var mstr = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr)); 
des = (mapResult)djosn.ReadObject(mstr); 

var latitude = des.results[0].geometry.location.lat; 
var longitude = des.results[0].geometry.location.lng; 

請注意,我的代碼只與你的樣品JSON對象測試,並且不保證由Web服務返回的一切工作。如果你想要的不僅僅是經緯度,那麼你也可以對object進行非常多的反串行化處理,這可能會讓你感到尷尬。

+0

我無法在WP7中獲得JsonConvert。如何得到那一個?是否有任何名稱空間必須添加? – selladurai 2010-12-23 12:15:34

2

我注意到,您的頂層列表被稱爲result而JSON名字是results順便說一句 - 會不會是這麼簡單嗎?也許反序列化器忽略了results的值,因爲您沒有該名稱的屬性。

如果這樣做不起作用...您在該語句中有7個取消引用操作。 (4個明顯的和3個數組索引操作)。這是很多可能的失敗點。我建議你在該語句上放置一個斷點(在執行之前斷開),然後使用觀察窗口查看你實際得到的結果。

(我個人用過Json.NET中的Windows Phone 7,而不是內置的庫,但我敢肯定,後者應該工作了。)

相關問題