【问题标题】:Xamarin - Cannot cast from source type to destination typeXamarin - 无法从源类型转换为目标类型
【发布时间】:2015-07-06 12:07:09
【问题描述】:

我想反序列化一个动态变量中的 json 文档,但是它抛出了

一个错误:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.InvalidCastException: Cannot cast from source type to destination type.
[MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <IL 0x00011, 0x00078>
[MonoDroid] at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <IL 0x00006, 0x0006b>
[MonoDroid] at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/1879/5f55a9ef/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:18
[MonoDroid] at Java.Lang.Thread/RunnableImplementor.Run () [0x0000b] in /Users/builder/data/lanes/1879/5f55a9ef/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs:36
[MonoDroid] at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) [0x00009] in /Users/builder/data/lanes/1879/5f55a9ef/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Java.Lang.IRunnable.cs:71
[MonoDroid] at (wrapper dynamic-method) object.461b928a-1fde-4250-8fe8-4ab69b1f0acd (intptr,intptr) <IL 0x00011, 0x0003b>
[art] JNI RegisterNativeMethods: attempt to register 0 native methods for md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable
[AndroidRuntime] Shutting down VM   

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Json;
using System.Net;
using System.IO;
using System.Threading.Tasks;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

using Newtonsoft.Json;

namespace HomecheckApp {
    [Activity(Label = "LoginActivity", MainLauncher = true)]
    public class LoginActivity : Activity {
        private const string apiKey = "*********************************************";
        protected override void OnCreate(Bundle bundle) {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Login);

            EditText email = FindViewById<EditText>(Resource.Id.editEmail);
            EditText password = FindViewById<EditText>(Resource.Id.editPassword);
            Button loginButton = FindViewById<Button>(Resource.Id.loginButton);
//          string url = "http://homecheck.192.168.1.102.xip.io/appapi/finduser?email" + email.Text + "&pass=" + password.Text + "&key=" + apiKey;
            loginButton.Click += async (sender, e) => {
                string url = "http://homecheck.********.eu/appapi/finduser?email=" + email.Text + "&pass=" + password.Text + "&key=" + apiKey;
                JsonValue json = await FetchUserAsync(url, apiKey);
     //This is where it breaks
                dynamic userInfo = JsonConvert.DeserializeObject(json);
    //*********
                Console.WriteLine("Email is: " + userInfo.email);
            };  
        }

        private async Task<JsonValue> FetchUserAsync(string url, string apiKey) {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
            request.ContentType = "application/json";
            request.Method = "POST";
            using(WebResponse response = await request.GetResponseAsync()) {
                using(Stream stream = response.GetResponseStream()) {
                    JsonValue jsonResponse = await Task.Run(() => JsonObject.Load(stream));
                    Console.WriteLine(jsonResponse.ToString());
                    return jsonResponse;
                }
            }
        }
    }

}

Json 看起来像这样:

{"error":false,"id":3,"name":"***********","surname":"*******","email":"***********@gmail.com","gsm":"1239102312930","company":"","address":3}

当我尝试使用JObject.Parse 对其进行反序列化时出现同样的错误。这是 IDE 本身的问题(我使用的是 Xamarin Studio)还是其他问题?

【问题讨论】:

    标签: c# android json xamarin json.net


    【解决方案1】:

    JsonConvert.DeserializeObject()string 作为其第一个参数。但是,您提供的是JsonValue 类型的对象。我不太清楚为什么编译器甚至允许这样做,但这很可能是您问题的根源。

    简单的改变

    dynamic userInfo = JsonConvert.DeserializeObject(json);
    

    dynamic userInfo = JsonConvert.DeserializeObject(json.ToString());
    

    至少应该修复您的异常。然而,这可能不是最优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多