2012-03-08 68 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