【问题标题】:Android: Reading JSON data into a class with ArrayListAndroid:使用 ArrayList 将 JSON 数据读入类
【发布时间】:2014-08-01 03:12:47
【问题描述】:

我正在使用包含 GSON 的 Azure SDK 将来自 Microsoft Azure 的查询结果存储到一个类中。我一直按照此示例中的说明进行操作:http://blogs.msdn.com/b/carlosfigueira/archive/2013/06/19/custom-api-in-azure-mobile-services-client-sdks.aspx

所以我能够将一个简单的示例保存到一个包含所有字符串的类中。但是,当我尝试将数据存储到包含 ArrayList 在内的混合类型的类中时,我遇到了障碍。这是我的课:

class clsUser {
    public String UserID;
    public String UserName;
    public String UserStatus;
    public ArrayList<String> UserEmails;
    //Constructors, methods, etc
}

一个 clsUser 实例可以有 0 个或多个 UserEmail,所以我使用 ArrayList。我应该说我一直在我的应用程序中使用这个类 - 提取 JSON 数据是新的,但我想走这条路。

JsonObject 看起来像这样:

{"UserID":85,"UserName":null,"UserEmails":"Call.Me@Maybe.org","UserStatus":"T"}

我也尝试过调整 API,使其返回以下各项:

{"UserID":85,"UserName":null,"UserEmails":"[Call.Me@Maybe.org]","UserStatus":"T"}

{"UserID":85,"UserName":null,"UserEmails":"[{Call.Me@Maybe.org}]","UserStatus":"T"}

我收到一个错误“Expected BEGIN_ARRAY but was STRING”,我知道这意味着它将“Call.Me@Maybe.org”视为一个字符串,但我怎样才能让它进入 ArrayList 字段?:

07-31 22:59:18.776  27842-27842/com.myapp.app.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.myapp.app.debug, PID: 27842
    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
            at com.google.gson.Gson.fromJson(Gson.java:795)
            at com.google.gson.Gson.fromJson(Gson.java:859)
            at com.google.gson.Gson.fromJson(Gson.java:832)
            at com.microsoft.windowsazure.mobileservices.JsonEntityParser.parseResults(JsonEntityParser.java:62)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$4.onCompleted(MobileServiceClient.java:615)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$5.onResponse(MobileServiceClient.java:710)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$6.onPostExecute(MobileServiceClient.java:825)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$6.onPostExecute(MobileServiceClient.java:1)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5487)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
            at com.google.gson.internal.bind.JsonTreeReader.expect(JsonTreeReader.java:139)
            at com.google.gson.internal.bind.JsonTreeReader.beginArray(JsonTreeReader.java:58)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
            at com.google.gson.Gson.fromJson(Gson.java:795)
            at com.google.gson.Gson.fromJson(Gson.java:859)
            at com.google.gson.Gson.fromJson(Gson.java:832)
            at com.microsoft.windowsazure.mobileservices.JsonEntityParser.parseResults(JsonEntityParser.java:62)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$4.onCompleted(MobileServiceClient.java:615)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$5.onResponse(MobileServiceClient.java:710)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$6.onPostExecute(MobileServiceClient.java:825)
            at com.microsoft.windowsazure.mobileservices.MobileServiceClient$6.onPostExecute(MobileServiceClient.java:1)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5487)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

我认为错误出在数据或类中,但为了完整起见,这是我正在使用的代码。在错误出现之前,所有日志都没有机会运行:

List<Pair<String, String>> params = new ArrayList<Pair<String, String>>();
params.add(new Pair<String, String>("email", emailtext));
params.add(new Pair<String, String>("token", Token));
Azure.invokeApi("user/login", "GET", params, clsUser.class, new ApiOperationCallback<clsUser>() {
    @Override
    public void onCompleted(clsUser result, Exception e, ServiceFilterResponse response) {
        if (e == null) {
            Log.d("Login GetToken","Azure success: ID=" + result.getUserID());
            Log.d("Login GetToken","Azure success: " + result.getAll().toString());
            currentUser = result;
        } else {
            Log.d("Login GetToken","Azure Error: " + e.toString());
        }
    }
});

有人有这种混班的经验吗?

【问题讨论】:

  • 我认为 Json 的格式应该是:{"UserID":85,"UserName":null,"UserEmails":["Call.Me@Maybe.org"],"UserStatus" :"T"}

标签: java android json azure gson


【解决方案1】:

我还没有针对这种情况对此进行测试(自 8 月以来,我想出了一个我不想重新审视的解决方法)。

但我认为这里的关键是创建一个自定义反序列化器来告诉 Gson 如何解释数据。

见:Custom JSON deserializer using Gson

然后使用mClient.registerSerializer方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多