2010-12-23 2 views
1

JSON 웹 서비스 결과에 대한 클래스를 만들려면 어떻게해야합니까? 이 JSON 결과는 Google API에서 가져옵니다. 그래서,이 JSON 객체를위한 클래스와 비 직렬화를 만드는 법.Windows phone 7에서 JSON 웹 서비스 결과 클래스를 만드는 방법은 무엇입니까?

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

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

그래서 난 결과 세부 사항과 다른 사람에 대한 목록을 creadet : alt text

나는,

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 클래스를 같은이 JSON 객체를 직렬화하는 클래스를 생성

이제 Null 참조가 나타납니다. 그것은 그렇게 간단 수 -

alt text

+1

미래에 그림이 아닌 코드 텍스트 (또는 json 개체)를 포함 시키십시오. 그것은 당신이하고있는 것을 시도하고 재창조하는 것을 훨씬 더 쉽게 만듭니다. –

답변

4

(개인적으로 나는 윈도우 폰 7이 아닌 라이브러리를 내장,하지만 난 후자가 너무 작업을해야 확신 해요.에 Json.NET을 사용했습니다).

나는 아래의 내용을 수정하고 원래 줄을 주석 처리했으며 특별히 잘못 된 것에 대한 의견을 추가했습니다.

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

다음 코드

이 작동하는지 보여줍니다 내 코드 만 샘플 JSON 객체로 테스트하고 웹 서비스에서 반환 모든 것을 함께 작동하도록 보장되지

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; 

참고. 또한 위도와 경도 이외의 다른 것을 원한다면 작업하기에 어색 할 수도있는 object으로 꽤 많이 버티고 있습니다.

+0

WP7에서 JsonConvert를 가져올 수 없습니다. 그걸 얻는 방법? 추가해야하는 네임 스페이스가 있습니까? – selladurai

+0

@selladurai 유감스럽게도 Json.net (Silveight 버전)을 사용하고 있는데 깜빡했는데 –

+0

@selladurai'DataContractJsonSerializer'를 사용하는 코드 버전으로 답변을 업데이트했습니다. json.net을 사용하는 것이 더 빠릅니다. –

2

는 내가 JSON 이름 results이 BTW 반면 최상위 목록이 result라고 있습니다? 그 이름의 속성을 가지고 있지 않기 때문에 디시리얼라이저가 results 값을 무시하고있는 것일 수 있습니다.

작동하지 않는 경우 ... 해당 명세서에 7 개의 역 참조 연산이 있습니다. (4 개의 명백한 것 및 3 개의 배열 색인 작업). 그것은 가능한 많은 실패 지점입니다. 그 진술에 break point를 두어 (실행하기 전에 깨기) watch window를 사용하여 실제로 어떤 결과를 얻었는지 살펴볼 것을 제안한다.

은 DatContract 클래스와 몇 가지 문제가 있었다