Десериализация сильно типизированной коллекции списков json на Windows Phone 7 - PullRequest
1 голос
/ 08 марта 2012

Я начну с показа 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}]}

Это происходит из объекта Fleets, который содержит коллекцию списков объектов Fleet, например:

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

Пользовательский объект 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);
    }
}

Что происходит, если я получаю возвращенный объект Fleets с пустой коллекцией списков.Этот же код работает с объектами, у которых нет коллекций.Так что, если бы я только возвращал объект Fleet, у меня не было бы проблем с получением ответа.Кажется, что этот десериализатор не способен десериализовать объект, который содержит коллекцию списков пользовательских типов ???

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Ваша собственность «флотов» должна быть публичной, а имена должны совпадать.Попробуйте это с этим:

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 голосов
/ 08 марта 2012

используйте библиотеку json.net, так как DataContractJsonSerializer не поддерживает десериализацию словаря.

вы можете попробовать что-то вроде

var result = JsonConvert.DeserializeObject (yourclass) (ваша строка);(поставьте угловую скобку для своего класса)

...