【问题标题】:Error while parsing json using gson on android在android上使用gson解析json时出错
【发布时间】:2013-07-04 12:31:48
【问题描述】:

我正在关注 gson-android 的本教程

http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html

我的json是

{"IsAuthenticated":true,"BusinessId":57,"Success":true,"ErrorId":0}

我已经创建了我的模型对象:

LoginResponse.java

import com.google.gson.annotations.SerializedName;
import com.xxxx.xxxx.R.string;

public class LoginResponse {

    @SerializedName("Sucess")
    private Boolean sucess;

    @SerializedName("IsAuthenticated")
    private Boolean isAuthenticated;

    @SerializedName("BusinessId")
    private String businessId;

    @SerializedName("ErrorId")
    private string errorId;

    public Boolean getSucess() {
        return sucess;
    }

    public void setSucess(Boolean sucess) {
        this.sucess = sucess;
    }

    public Boolean getIsAuthenticated() {
        return isAuthenticated;
    }

    public void setIsAuthenticated(Boolean isAuthenticated) {
        this.isAuthenticated = isAuthenticated;
    }

    public String getBusinessId() {
        return businessId;
    }

    public void setBusinessId(String businessId) {
        this.businessId = businessId;
    }

    public string getErrorId() {
        return errorId;
    }

    public void setErrorId(string errorId) {
        this.errorId = errorId;
    }

}

运行此代码后,我的应用程序正在强制关闭。

LOGCAT

    07-04 12:22:40.682: E/AndroidRuntime(2694): FATAL EXCEPTION: AsyncTask #3
07-04 12:22:40.682: E/AndroidRuntime(2694): java.lang.RuntimeException: An error occured while executing doInBackground()
07-04 12:22:40.682: E/AndroidRuntime(2694):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.lang.Thread.run(Thread.java:856)
07-04 12:22:40.682: E/AndroidRuntime(2694): Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 67
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.Gson.fromJson(Gson.java:803)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.Gson.fromJson(Gson.java:741)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.example.xxxx.loginActivity.ValidateUser(LoginActivity.java:300)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.example.xxxx.loginActivity.access$0(LoginActivity.java:276)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.example.xxxx.loginActivity$UserLoginTask.doInBackground(LoginActivity.java:222)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.example.xxxx.loginActivity$UserLoginTask.doInBackground(LoginActivity.java:1)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-04 12:22:40.682: E/AndroidRuntime(2694):     ... 4 more
07-04 12:22:40.682: E/AndroidRuntime(2694): Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 67
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
07-04 12:22:40.682: E/AndroidRuntime(2694):     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
07-04 12:22:40.682: E/AndroidRuntime(2694):     ... 14 more

..我就是这样做的

    HttpResponse response = client.execute(httpGet);

    StatusLine statusLine = response.getStatusLine();
    int statusCode = statusLine.getStatusCode();
    if (statusCode == 200) {
        HttpEntity entity = response.getEntity();
        InputStream content = entity.getContent();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(content));


        Gson gson = new Gson();
        LoginResponse myResponse = gson.fromJson(reader, LoginResponse.class);
        Log.d(TAG, myResponse.getBusinessId().toString());



    } else {
        Log.e(TAG, "Failed to download file");
    }

我做错了吗?我只是跟着 tut 里的东西。谁能帮帮我。

更新:

在将字符串更正为字符串和其他内容后,我能够修复应用程序崩溃。我仍然无法得到对象。

此处更新日志

07-08 05:02:53.625: W/System.err(869): org.json.JSONException: End of input at character 0 of 
07-08 05:02:53.656: W/System.err(869):  at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
07-08 05:02:53.656: W/System.err(869):  at org.json.JSONTokener.nextValue(JSONTokener.java:97)
07-08 05:02:53.656: W/System.err(869):  at org.json.JSONObject.<init>(JSONObject.java:154)
07-08 05:02:53.656: W/System.err(869):  at org.json.JSONObject.<init>(JSONObject.java:171)
07-08 05:02:53.656: W/System.err(869):  at com.example.xxxx.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:238)
07-08 05:02:53.656: W/System.err(869):  at com.example.xxxx.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:1)
07-08 05:02:53.656: W/System.err(869):  at android.os.AsyncTask.finish(AsyncTask.java:631)
07-08 05:02:53.656: W/System.err(869):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
07-08 05:02:53.656: W/System.err(869):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-08 05:02:53.675: W/System.err(869):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 05:02:53.675: W/System.err(869):  at android.os.Looper.loop(Looper.java:137)
07-08 05:02:53.675: W/System.err(869):  at android.app.ActivityThread.main(ActivityThread.java:5041)
07-08 05:02:53.675: W/System.err(869):  at java.lang.reflect.Method.invokeNative(Native Method)
07-08 05:02:53.675: W/System.err(869):  at java.lang.reflect.Method.invoke(Method.java:511)
07-08 05:02:53.675: W/System.err(869):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-08 05:02:53.675: W/System.err(869):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-08 05:02:53.675: W/System.err(869):  at dalvik.system.NativeStart.main(Native Method)

我用谷歌搜索了这个,但没有得到解决方案

【问题讨论】:

  • 试试这个,保存字符串类型的json值..

标签: android gson


【解决方案1】:

你的

   @SerializedName("BusinessId")
    private String businessId;

    @SerializedName("ErrorId")
    private string errorId;

应该是整数

  @SerializedName("BusinessId")
    private int businessId;

    @SerializedName("ErrorId")
    private int errorId;

【讨论】:

  • Gson 不在乎。它会自动将数字转换为字符串。那不是那个错误的意思。
【解决方案2】:

您从 Gson 收到的错误是告诉您它期望在 JSON 的第 67 列(字符)处找到 {。这意味着errorId 是Java 类中的对象类型,而不是数字(例如intlong)或String(请参阅下面关于自动String 转换的最后一段)。

查看您的代码,您有...

@SerializedName("ErrorId")
private string errorId;

显然你已经创建了一个string 类(小写s),已经使用了它,Gson 正在尝试反序列化它。这就是为什么你应该永远这样做。首先,类是Java应该以大写字母开头。其次,您永远不应该创建与系统名称相同的类。 (选项 B 是您显示的 Java 类 不是 实际运行的是什么,并且那里有一些其他对象类型)。

如果您通过将其更改为 String 来解决此问题,则错误将消失。即使errorId(和businessId)现在在您的Java 中是String,Gson 实际上会自动将JSON 中的数字类型转换为Java 类中的String 类型。您还需要修复 sucess 中的拼写错误,否则它将最终成为 null,因为 JSON 中不存在该拼写错误,并且 Gson 会默默地忽略任何缺失的元素。

【讨论】:

    【解决方案3】:

    您的 LoginResponse.java 中有错字:

    @SerializedName("Sucess")
    

    应该是

    @SerializedName("Success")
    

    也许还有更多问题,您能否检查一下您尝试解析的 JSON 是否确实是您所期望的?

    【讨论】:

    • 变量sucess也应该重命名为success。
    • 变量名如果有注释应该没关系吧?当然,保持拼写正确总是好的 :)
    • 绝对 - 当然,如果您错误命名 json 键行为应该是它没有被设置!
    • 现在是 org.json.JSONException: End of input at character 0 of (请在更新的问题中找到日志)
    【解决方案4】:

    private string errorId; 真的是小写的吗?您可能需要Stringint(两者都可以)。

    gson 中的反射内容会读取您的字段类型,并认为它必须是嵌套 json 对象可以映射到的对象。可以解释Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NUMBER at line 1 column 67:你的反射映射器期待ErrorId 的对象(但不是java.lang.String)类型,因为你给了它一些它认为是另一种对象的东西——神秘的string。然而,String 是一个知道如何处理的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多