我将开始通过显示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对象,那么得到我的回应就没有问题。看来这个反序列化器不能反序列化包含自定义类型列表集合的对象?
这填充了集合。我曾经玩过这个集合的访问级别,但从未想过它的名字。我错过了这一点,并做了几个小时的研究,我不确定。非常感谢! – puddinman13 2012-03-09 01:34:29