2016-01-15 4 views
2

Я нашел странное поведение variable instanceof JSONObject. У меня следующий код:instanceof JSONObject не обнаруживает JSONObject

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 она заканчивается за исключением:

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) 
         ........... 

я упускаю что-то? Это выглядит так просто ...

EDIT: JSON

Пример JSON Я использованием. Во-первых это JSONObject, второй является Integer (может быть литыми в строку)

{ 
"viewers_edit_time": 
    { 
    "date":"2016-01-14 22:53:56.000000", 
    "timezone_type":3, 
    "timezone":"Asia/Kolkata" 
    }, 
"viewers_edit_users_id":1 
} 

That's full json, точно так же я использую. И снова:

Log.v("type", String.valueOf(value.getClass())); // Returns JSONObject not JSONObject$1 

решаемые

проблема решена. Из полного JSON я писал в вопросе:

"viewers_postcode": null 

я не заметил, что нуль не в кавычках ... Раньше я думал, что я был «нулевым», который является строкой. Я ошибался сообщением об ошибке, которое я получил, которое говорит JSONObject$1 cannot be casted to String. Но JSONObject $1 является NULL (кредиты @Natix)

Возможно, это помогает другим людям с тем же сообщением об ошибке.

+0

Я думаю, что 'Object' не может быть экземпляром 'JSONObject', поскольку' Object' является супер. Условие всегда будет ложным. –

+0

Опубликовать Json & Code, чтобы дать правильный ответ. –

+0

Вы уверены, что ошибка подходит к этой строке? Здесь я не нахожу ничего плохого. – Rohit5k2

ответ

2

Необходимо обратить особое внимание на сообщение журнала. Дело в том, что org.json.JSONObject$1 is не такое же как класс org.json.JSONObject.

Суффикс $1 означает, что это анонимный внутренний класс класса JSONObject. Если вы посмотрите в the source, вы найдете этот кусок кода:

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"; 
    } 
}; 

Это означает, что вы должны сначала проверить, если ваше значение равно NULL этой константы:

Object value = customer.get(key); 
if (value == JSONObject.NULL { 
    // Handle NULL 
} else if (value instanceof JSONObject) { 
    // Handle JSONObject 
} else { 
    // Handle String 
} 
+0

Хорошо, это работает, но означает ли это, что значение NULL? – kristyna

+0

@Natix: NULL является внутренним классом 'JSONObject', я думаю, что должен быть правильный путь. это похоже на «клиент».get (Key) 'не удаляет' jsonObject' –

+0

@kikinet. Это не пустое значение в смысле Java, оно равно null в контексте JSON. Документы говорят: _Данное значение, используемое для явного определения имени без значения. В отличие от null, имена с этим значением: отображаются в массиве names(), отображаются в клавишах() iterator, return true для has (String), не бросают на get (String), включаются в закодированную строку JSON ._ – Natix