首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONObject的实例不能检测到JSONObject

JSONObject的实例不能检测到JSONObject
EN

Stack Overflow用户
提问于 2016-01-15 11:48:46
回答 1查看 4.1K关注 0票数 3

我发现了variable instanceof JSONObject的奇怪行为。我有以下代码:

代码语言:javascript
复制
Object value;
try {
    value = customer.get(key);
    Log.v("type", String.valueOf(value.getClass())); // Returns JSONObject
    if (value instanceof JSONObject) {
        // Handle JSONObject
    } else {
        String text = (String)value;  // HERE COMES THE ERROR
        // Handle String
    }

当日志返回JSONObject时,它将以异常结束:

代码语言:javascript
复制
01-15 12:24:46.206 4111-4111/cz.jacon.goldympos V/CUSTOMER type: class org.json.JSONObject$1
01-15 12:24:46.207 4111-4111/cz.jacon.goldympos D/AndroidRuntime: Shutting down VM
01-15 12:24:46.279 4111-4111/cz.jacon.goldympos E/AndroidRuntime: FATAL EXCEPTION: main
                   Process: cz.jacon.goldympos, PID: 4111
                   java.lang.RuntimeException: Unable to start activity ComponentInfo{cz.jacon.goldympos/cz.jacon.goldympos.activities.CustomerDetailActivity}: java.lang.ClassCastException: org.json.JSONObject$1 cannot be cast to java.lang.String
                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                            at android.app.ActivityThread.access$800(ActivityThread.java:151)
                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                            at android.os.Handler.dispatchMessage(Handler.java:102)
                            at android.os.Looper.loop(Looper.java:135)
                            at android.app.ActivityThread.main(ActivityThread.java:5254)
                            at java.lang.reflect.Method.invoke(Native Method)
                            at java.lang.reflect.Method.invoke(Method.java:372)
                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                            Caused by: java.lang.ClassCastException: org.json.JSONObject$1 cannot be cast to java.lang.String
                            at cz.jacon.goldympos.activities.CustomerDetailActivity.getText(CustomerDetailActivity.java:260)
                            at cz.jacon.goldympos.activities.CustomerDetailActivity.createLayout(CustomerDetailActivity.java:222)
                            at cz.jacon.goldympos.activities.CustomerDetailActivity.onCreate(CustomerDetailActivity.java:92)
                            at android.app.Activity.performCreate(Activity.java:5990)
                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                        ...........

我是不是遗漏了什么?看起来很简单..。

编辑: json

json I使用的例子。第一个是JSONObject,第二个是Integer (可以转换为String)

代码语言:javascript
复制
{
"viewers_edit_time":
    {
     "date":"2016-01-14 22:53:56.000000",
     "timezone_type":3,
     "timezone":"Asia/Kolkata"
    },
"viewers_edit_users_id":1
}

这是完整的json,和我用的一模一样。又一次:

代码语言:javascript
复制
Log.v("type", String.valueOf(value.getClass())); // Returns JSONObject not JSONObject$1

解决了

问题解决了。从我发布的完整JSON中可以看出:

代码语言:javascript
复制
"viewers_postcode": null

我没注意到零不在引号里.之前我认为我是"null“,也就是字符串。我被我收到的错误信息搞错了,上面写着JSONObject$1 cannot be casted to String。但是JSONObject$1是空的(@Natix的学分)

也许这对拥有相同错误信息的其他人有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 12:54:33

您需要仔细注意日志消息。关键是org.json.JSONObject$1,而不是org.json.JSONObject类的

$1后缀意味着它是JSONObject类的匿名内部类。如果您查看来源,您会发现以下代码:

代码语言:javascript
复制
public static final Object NULL = new Object() {
    @Override public boolean equals(Object o) {
        return o == this || o == null; // API specifies this broken equals implementation
    }
    @Override public String toString() {
        return "null";
    }
};

这意味着您应该首先检查您的值是否等于这个空常量:

代码语言:javascript
复制
Object value = customer.get(key);
if (value == JSONObject.NULL {
    // Handle NULL
} else if (value instanceof JSONObject) {
    // Handle JSONObject
} else {
    // Handle String
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34810414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档