1

N+1 Days of MvvmCross アプリケーション サンプルのレッスン 6 で簡単なアプリケーションを作成しようとしています。しかし、 json データのシリアル化の変換中に SimpleRestService で失敗しました。

private T Deserialize<T>(string responseBody)
{   // Error is here for deserilizing
    var toReturn = _jsonConverter.DeserializeObject<T>(responseBody);
    return toReturn;
}

ブラウザを介した私のJsonデータ

[{"Desc":"All","Id":"0"},{"Desc":"割り当て済み","Id":"2"},{"Desc":"進行中","Id" :"3"},{"Desc":"解決済み","Id":"4"},{"Desc":"クローズ","Id":"5"},{"Desc":"保留" ,"Id":"6"},{"Desc":"低","Id":"8"},{"Desc":"承認待ち","Id":"9"},{"Desc ":"キャンセル済み","Id":"10"},{"Desc":"未解決","Id":"8"}]

responsebody のアプリケーションの Json データ:

[{\"Desc\":\"All\",\"Id\":\"0\"},{\"Desc\":\"Assigned\",\"Id\":\"2\ "},{\"Desc\":\"進行中\",\"Id\":\"3\"},{\"Desc\":\"解決済み\",\"Id\":\ "4\"},{\"Desc\":\"Closed\",\"Id\":\"5\"},{\"Desc\":\"Hold\",\"Id\" :\"6\"},{\"Desc\":\"低\",\"Id\":\"8\"},{\"Desc\":\"承認待ち\",\" Id\":\"9\"},{\"Desc\":\"キャンセル\",\"Id\":\"10\"},{\"Desc\":\"未解決\" ,\"ID\":\"8\"}]

エラーメッセージは次のように表示されます:

{Newtonsoft.Json.JsonSerializationException: JSON 配列 ([1,2,3]) を「Book.Core.Services.BookSearchResult」型に逆シリアル化できません。逆シリアル化された型は、配列であるか、IEnumerable、ICollection、IList などのコレクション インターフェイスを実装する必要があります。JSON 配列を強制的に逆シリアル化するには、JsonArrayAttribute を型に追加します。パス ''、行 1、位置 1。 .Json.Serialization.JsonSerializerInternalReader.CreateList (Newtonsoft.Json.JsonReader リーダー、System.Type objectType、Newtonsoft.Json.Serialization.JsonContract コントラクト、Newtonsoft.Json.Serialization.JsonProperty メンバー、System.

私のコード部分: クラス宣言:

public class BookSearchItem
{
    public string Desc { get; set; }
    public string Id { get; set; }
}
    public class BookSearchResult
{
   public List<BookSearchItem> items { get; set; }      
}

拘束力のある宣言:

public void StartSearchAsync(string whatFor, Action<BookSearchResult> success, Action<Exception> error)
    {           
        string address = string.Format("http://192.168.0.76/eFACiLiTYPhone/MobileService/WinPhoneWCFService.svc/callstatustesting");
        _simpleRestService.MakeRequest<BookSearchResult>(address,"GET", success, error);
    }

共通の簡単な休憩サービス:

public class SimpleRestService :ISimpleRestService
{
    private readonly IMvxJsonConverter _jsonConverter;

    public SimpleRestService(IMvxJsonConverter jsonConverter)
    {
        _jsonConverter = jsonConverter;
    }

    public void MakeRequest<T>(string requestUrl, string verb, Action<T> successAction, Action<Exception> errorAction)
    {
        var request = (HttpWebRequest)WebRequest.Create(requestUrl);
        request.Method = verb;
        request.Accept = "application/json";

        MakeRequest(
           request,
           (response) =>
           {
               if (successAction != null)
               {
                   T toReturn;
                   try
                   {
                       toReturn = Deserialize<T>(response);
                   }
                   catch (Exception ex)
                   {
                       errorAction(ex);
                       return;
                   }
                   successAction(toReturn);
               }
           },
           (error) =>
           {
               if (errorAction != null)
               {
                   errorAction(error);
               }
           }
        );
    }

    private void MakeRequest(HttpWebRequest request, Action<string> successAction, Action<Exception> errorAction)
    {
        request.BeginGetResponse(token =>
        {
            try
            {
                using (var response = request.EndGetResponse(token))
                {
                    using (var stream = response.GetResponseStream())
                    {
                        var reader = new StreamReader(stream);
                        successAction(reader.ReadToEnd());
                    }
                }
            }
            catch (WebException ex)
            {
                Mvx.Error("ERROR: '{0}' when making {1} request to {2}", ex.Message, request.Method, request.RequestUri.AbsoluteUri);
                errorAction(ex);
            }
        }, null);
    }

    private T Deserialize<T>(string responseBody)
    {
        var toReturn = _jsonConverter.DeserializeObject<T>(responseBody);
        return toReturn;
    }
}
4

1 に答える 1