Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows phone 7上反序列化json强类型列表集合_Json_Windows Phone 7_Deserialization - Fatal编程技术网

在windows phone 7上反序列化json强类型列表集合

在windows phone 7上反序列化json强类型列表集合,json,windows-phone-7,deserialization,Json,Windows Phone 7,Deserialization,首先,我将展示我想要反序列化的JSON: {"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","Averag

首先,我将展示我想要反序列化的JSON:

{"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>();
}
最后,这里显示了我的反序列化代码。我相信这里有问题的部分是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);
    }
}
公共类DataAccessState
{
公共字符串Uri{get;set;}
公共T调用类类型{get;set;}
公共字符串方法调用{get;set;}
公共DataAccessState(){}
PublicDataAccessState(字符串uri、T callingClassType、字符串methodToCall)
{
Uri=Uri;
CallingClassType=CallingClassType;
MethodToCall=MethodToCall;
}
}
公共静态类DataAccessList
{
私有静态列表DataAccessState=新列表();
公共静态无效添加(DataAccessState DataAccessState)
{
添加(dataAccessState);
}
公共静态DataAccessState FindAndRemove(字符串uri)
{
var dataAccessState=新的dataAccessState();
foreach(DataAccessState中的var das)
{
if(das.Uri==Uri)
dataAccessState=das;
}
dataAccessState.Remove(dataAccessState);
返回dataAccessState;
}
}
公共类不动产
{
公共HttpWebRequest异步请求{get;set;}
公共HttpWebResponse异步响应{get;set;}
}
公共类数据访问
{
public void GetObject(string uriQuery、T callingClassType、string methodToCall)
{
//创建完整uri
var fullUri=”http://fuelizer.com/MobileJSON.svc/“+uriQuery;
//将呼叫类型添加到列表中
DataAccessState DataAccessState=新的DataAccessState(fullUri、callingClassType、methodToCall);
添加(dataAccessState);
//执行web服务调用
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(新Uri(fullUri));
RequestUpdateEstate requestState=new RequestUpdateEstate{AsyncRequest=request};
BeginGetResponse(GetDataResponse,requestState);
}
私有void GetDataResponse(IAsyncResult asyncResult)
{
尝试
{
RequestUpdateState requestState=(RequestUpdateState)asyncResult.AsyncState;
HttpWebRequest请求=requestState.AsyncRequest;
requestState.AsyncResponse=(HttpWebResponse)request.EndGetResponse(asyncResult);
Stream jsonObject=requestState.AsyncResponse.GetResponseStream();
Deployment.Current.Dispatcher.BeginInvoke(()=>ConvertObject(requestState.AsyncRequest.RequestUri.AbsoluteUri,jsonObject));
}
捕获(WebException e){}
}
私有void ConvertObject(字符串uri、流jsonObject)
{
var dataAccessState=DataAccessList.FindAndRemove(uri);
DataContractJsonSerializer ser=新的DataContractJsonSerializer(dataAccessState.CallingClassType.GetType());
var returnedObject=(T)ser.ReadObject(jsonObject);
MethodInfo MethodInfo=returnedObject.GetType().GetMethod(dataAccessState.MethodToCall);
调用(returnedObject,null);
}
}

发生的情况是,我得到一个返回的Fleets对象,其中包含一个空列表集合。这段代码也适用于没有集合的对象。因此,如果我只是返回一个舰队对象,我将不会有问题得到我的回应。此反序列化程序似乎无法反序列化包含自定义类型列表集合的对象???

使用json.net库,因为DataContractJsonSerializer不支持字典的反序列化

你可以试试类似的东西


var result=JsonConvert.DeserializeObject(您的类)(您的字符串);(为您的类放上角括号)

您的“舰队”属性需要是公共的,并且名称需要匹配。试试这个:

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; }
} 
公共级车队
{
公共列表车队集合=新列表();
}
公共级船队
{
public int FleetId{get;set;}
公共字符串昵称{get;set;}
公共字符串PictureFileName{get;set;}
公共双平均pg{get;set;}
公共双MaxMpg{get;set;}
} 

今晚我将尝试一下,并告诉您我发现了什么。谢谢你的意见。仔细看了你的回复后,我注意到你指的是一本字典。的确,DataContractJsonSerializer不会序列化字典对象,但是,它确实能够反序列化强类型对象的列表集合。这填充了集合。我玩过这个收藏的访问级别,但从来没想过它的名字。我不确定我是如何错过了这个机会,做了几个小时的研究。非常感谢你!
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; }
}