2010-12-23 8 views
1

JSON Webサービスの結果のクラスを作成するにはどうしたらいいですか?これはJSONの結果で、Googleのapiから取得します。したがって、このJSONオブジェクトのクラスと非直列化を作成する方法。 alt textJSON Webサービスのクラスを作成してWindows Phone 7にするにはどうすればいいですか?

私は

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

、このように、このJSONオブジェクトを直列化復元するためにクラスを作成し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; 
    } 

} 

今、私はNull参照を取得しています。

alt text

+1

今後、画像ではなくコード(またはjsonオブジェクト)のテキストを含めるようにしてください。あなたがやっていることを試して再現するのがずっと簡単です。 –

答えて

4

あなたDatContractクラスを持ついくつかの問題がありました。

私は以下の点を修正し、元の行をコメントアウトし、特に何が間違っていたかについてのコメントを追加しました。私のコードは、あなただけのサンプルJSONオブジェクトでテストされており、Webサービスによって返されたすべてでの動作が保証されていないことを

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; 

注:

[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; } 
} 

次のコードは、これが機能することを示しています。 objectには非常に多くのデシリアライズもあり、緯度と経度以上のものが必要な場合は、作業するのが面倒かもしれません。

+0

WP7でJsonConvertを取得できません。それをどうやって手に入れますか?追加する必要がある名前空間はありますか? – selladurai

+0

@selladurai申し訳ありませんが、私はJson.net(Silveightバージョン)を使用していて、忘れていました –

+0

@selladurai 'DataContractJsonSerializer'を使用するバージョンのコードで回答を更新しました。私はそれが速いので、json.netを使用することをお勧めしたいと思います! –

2

私は、JSONの名前がところでresultsであるのに対し、あなたのトップレベルのリストがresultと呼ばれることに注意してください - それはそのような単純なものだろうか?あなたはその名前のプロパティを持っていないので、デシリアライザはresultsの値を無視している可能性があります。

これでうまくいかない場合は、その文で7つの逆参照操作があります。 (4つの明示的なものと3つの配列索引付け操作)。それは恐ろしい可能性のある失敗点です。私はあなたが実際にどのような結果を見たかを見るためにウォッチウィンドウを使用して、その声明にブレークポイントを置くことを提案します。

(個人的に私は、Windows Phone 7のではなく、内蔵の図書館でJson.NETを使用しましたが、私は後者はあまりにも動作するはずと確信している。)

関連する問題