2012-03-08 71 views
1

我將開始通過顯示JSON我想反序列化:反序列化JSON強類型的Windows Phone上的列表收集7

{"FleetsCollection":[{"FleetId":2,"Nickname":"2007 Ninja ZX6R","PictureFileName":"jvmlfdaq.rkr2.jpg","AverageMpg":43.90925,"MaxMpg":47.945},{"FleetId":44,"Nickname":"Luminous Neptune","PictureFileName":"ochufm0c.ohm2.png","AverageMpg":29.4285,"MaxMpg":30.341}]} 

這來自它含有艦隊對象的列表集合,像這樣一個艦隊對象:

public class Fleets 
{ 
    private List<Fleet> fleets = new List<Fleet>(); 
} 

定製艦隊對象寫入如下:

public class Fleet 
{ 
    public int FleetId { get; set; } 
    public string Nickname { get; set; } 
    public string PictureFileName { get; set; } 
    public double AverageMpg { get; set; } 
    public double MaxMpg { get; set; } 
} 

網絡最後,我的反序列化代碼顯示在這裏。我相信在座的有問題的部分將在ConvertObject方法的幾行:

public class DataAccessState<T> 
{ 
    public string Uri { get; set; } 
    public T CallingClassType { get; set; } 
    public string MethodToCall { get; set; } 

    public DataAccessState(){} 

    public DataAccessState(string uri, T callingClassType, string methodToCall) 
    { 
     Uri = uri; 
     CallingClassType = callingClassType; 
     MethodToCall = methodToCall; 
    } 
} 

public static class DataAccessList<T> 
{ 
    private static List<DataAccessState<T>> dataAccessStates = new List<DataAccessState<T>>(); 

    public static void Add(DataAccessState<T> dataAccessState) 
    { 
     dataAccessStates.Add(dataAccessState); 
    } 

    public static DataAccessState<T> FindAndRemove(string uri) 
    { 
     var dataAccessState = new DataAccessState<T>(); 

     foreach (var das in dataAccessStates) 
     { 
      if (das.Uri == uri) 
       dataAccessState = das; 
     } 

     dataAccessStates.Remove(dataAccessState); 

     return dataAccessState; 
    } 
} 

public class RequestUpdateState 
{ 
    public HttpWebRequest AsyncRequest { get; set; } 
    public HttpWebResponse AsyncResponse { get; set; } 
} 

public class DataAccess<T> 
{ 
    public void GetObject(string uriQuery, T callingClassType, string methodToCall) 
    { 
     //Create full uri 
     var fullUri = "http://fuelizer.com/MobileJSON.svc/" + uriQuery; 

     //Add calling type to list 
     DataAccessState<T> dataAccessState = new DataAccessState<T>(fullUri, callingClassType, methodToCall); 
     DataAccessList<T>.Add(dataAccessState); 

     //Perform web service call 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(fullUri)); 
     RequestUpdateState requestState = new RequestUpdateState {AsyncRequest = request}; 

     request.BeginGetResponse(GetDataResponse, requestState); 
    } 

    private void GetDataResponse(IAsyncResult asyncResult) 
    { 
     try 
     { 
      RequestUpdateState requestState = (RequestUpdateState)asyncResult.AsyncState; 
      HttpWebRequest request = requestState.AsyncRequest; 
      requestState.AsyncResponse = (HttpWebResponse)request.EndGetResponse(asyncResult); 
      Stream jsonObject = requestState.AsyncResponse.GetResponseStream(); 

      Deployment.Current.Dispatcher.BeginInvoke(() => ConvertObject(requestState.AsyncRequest.RequestUri.AbsoluteUri, jsonObject)); 
     } 
     catch (WebException e){} 
    } 

    private void ConvertObject(string uri, Stream jsonObject) 
    { 
     var dataAccessState = DataAccessList<T>.FindAndRemove(uri); 

     DataContractJsonSerializer ser = new DataContractJsonSerializer(dataAccessState.CallingClassType.GetType()); 
     var returnedObject = (T)ser.ReadObject(jsonObject); 

     MethodInfo methodInfo = returnedObject.GetType().GetMethod(dataAccessState.MethodToCall); 
     methodInfo.Invoke(returnedObject, null); 
    } 
} 

會發生什麼事是我得到一個返回艦隊對空列表集合對象。這個相同的代碼適用於沒有集合的對象。所以,如果我只是返回一個Fleet對象,那麼得到我的迴應就沒有問題。看來這個反序列化器不能反序列化包含自定義類型列表集合的對象?

回答

3

你的車隊的財產需要公開,名稱需要匹配。試試這個:

public class Fleets 
{ 
    public List<Fleet> FleetsCollection = new List<Fleet>(); 
} 

public class Fleet 
{ 
    public int FleetId { get; set; } 
    public string Nickname { get; set; } 
    public string PictureFileName { get; set; } 
    public double AverageMpg { get; set; } 
    public double MaxMpg { get; set; } 
} 
+0

這填充了集合。我曾經玩過這個集合的訪問級別,但從未想過它的名字。我錯過了這一點,並做了幾個小時的研究,我不確定。非常感謝! – puddinman13 2012-03-09 01:34:29

0

使用json.net庫作爲DataContractJsonSerializer不支持對Dictionary進行反序列化。

你可以嘗試像

VAR的結果= JsonConvert.DeserializeObject(yourclass)(你的字符串); (爲你的班級安裝角度支架)

+0

我會給你一個嘗試今晚,讓你知道我找到了什麼。謝謝您的意見。 – puddinman13 2012-03-08 13:39:59

+0

經過仔細審查你的回覆後,我注意到你指的是一本字典。 DataContractJsonSerializer確實不會序列化一個字典對象,但是它確實能夠反序列化強類型對象的列表集合。 – puddinman13 2012-03-09 01:35:42