2010-08-25 9 views
5

Heya, ho un errore molto strano che non riesco a risolvere quando si tenta di serializzare oggetti su JSON su tutte le piattaforme Android, dalla versione 1.5 alla 2.2 (sia su telefoni che emulatori).NoMethodError su oggetto runtime Android standard

ricevo questo errore:

E/AndroidRuntime(21017): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception 
E/AndroidRuntime(21017): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(21017): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(21017): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
E/AndroidRuntime(21017): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
E/AndroidRuntime(21017): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
E/AndroidRuntime(21017): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
E/AndroidRuntime(21017): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
E/AndroidRuntime(21017): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
E/AndroidRuntime(21017): at java.lang.Thread.run(Thread.java:1096) 
E/AndroidRuntime(21017): Caused by: java.lang.NoSuchMethodError: org.json.JSONStringer.object 
E/AndroidRuntime(21017): at com.qype.radar.api.json.JsonSerializationHelper.startModel(JsonSerializationHelper.java:119) 
E/AndroidRuntime(21017): at com.qype.radar.api.json.JsonSerializationHelper.serializeCheckin(JsonSerializationHelper.java:94) 
E/AndroidRuntime(21017): at com.qype.radar.api.QypeApiImpl.submitCheckin(QypeApiImpl.java:157) 
E/AndroidRuntime(21017): at com.qype.radar.activities.tasks.SubmitCheckinTask.doCheckedInBackground(SubmitCheckinTask.java:29) 
E/AndroidRuntime(21017): at com.qype.radar.activities.tasks.SubmitCheckinTask.doCheckedInBackground(SubmitCheckinTask.java:1) 
E/AndroidRuntime(21017): at com.github.droidfu.concurrent.BetterAsyncTask.doInBackground(BetterAsyncTask.java:154) 
E/AndroidRuntime(21017): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
E/AndroidRuntime(21017): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
E/AndroidRuntime(21017): ... 4 more 

quando si arriva alla linea 'stringer.object' da 'startModel()' durante la serializzazione una recensione in questo codice:

package com.qype.radar.api.json; 

import org.json.JSONException; 
import org.json.JSONStringer; 

import com.qype.radar.model.Review; 

public class JsonSerializationHelper { 

    private JSONStringer stringer = new JSONStringer(); 

    ... 

    public String serializeReview(Review review) throws JSONException { 

     startModel("review"); 

     value("rating", review.getRating()); 
     value("language", review.getLanguage()); 
     value("content", review.getText()); 

     return endModel(); 
    } 

    ... 

    private JSONStringer startModel(String name) throws JSONException { 
     stringer.object(); 
     stringer.key(name); 
     stringer.object(); 
     return stringer; 
    } 

    private String endModel() throws JSONException { 
     stringer.endObject(); 
     stringer.endObject(); 
     return stringer.toString(); 
    } 

    private void value(String key, String value) throws JSONException { 
     stringer.key(key); 
     stringer.value(value); 
    } 

    private void value(String key, int value) throws JSONException { 
     stringer.key(key); 
     stringer.value(value); 
    } 
} 

La cosa più strana a questo proposito il codice viene compilato correttamente e, al momento del debug, l'oggetto JSONStringer viene istanziato correttamente, ma tutte le chiamate inviano questo errore. Sono anche in grado, usando la riflessione di Java, di scoprire che la classe esiste e che i metodi che posso recuperare dall'oggetto classe sono tutti lì e possono essere richiamati senza errori.

Il pacchetto org.json è uno standard di Android, ed è disponibile dal API versione 1.

Qualsiasi aiuto per risolvere questo problema sarebbe apprezzato, come ho semplicemente non sanno dove guardare.

+0

solo per aumentare la confusione: la cosa divertente è che * * deserializzazione utilizzando le classi 'org.json' funziona bene ... questi errori appena arrivato quando * * serializzazione degli oggetti. – Matthias

risposta

4

Si è verificato un problema con il JAR Android di Maven Central. Ha una dipendenza dai JAR JSON, ma quelli sono interrotti su Maven Central (la classe JSONStringer è vuota, definisce solo un metodo toString()).

Se si utilizza anche Maven, è possibile risolvere questo problema distribuendo il jar Android dell'SDK utilizzando maven-android-sdk-deployer e passando da lì.

Vedi this thread

Problemi correlati