2010-08-25 14 views
5

Heya, j'obtiens une erreur très étrange que je n'arrive pas à résoudre lorsque je tente de sérialiser des objets sur JSON sur toutes les plates-formes Android, de 1.5 à 2.2 (sur téléphones et émulateurs).NoMethodError sur l'objet d'exécution Android standard

Je reçois cette erreur:

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 

en arrivant à la ligne 'stringer.object' de 'startModel() lors de la sérialisation d'un examen de ce code:

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 chose la plus étrange À propos de ceci, le code compile bien, et lors du débogage, l'objet JSONStringer est instancié ok, mais tous les appels lancent cette erreur. Je peux également, en utilisant la réflexion de Java, découvrir que la classe existe et que les méthodes que je peux récupérer de l'objet de classe sont toutes là, et peuvent être invoquées sans erreur.

Le paquet org.json est un standard dans Android, et est disponible depuis la version API 1.

Toute aide à résoudre ce problème serait apprécié, comme je ne sais pas où regarder simplement.

+0

juste pour ajouter à la confusion: le plus drôle est que * désérialisation * en utilisant les classes 'org.json' fonctionne très bien ... ces erreurs viennent juste quand * * sérialisation d'objets. – Matthias

Répondre

4

Il s'avère que c'était un problème avec le JAR Android de Maven Central. Il a une dépendance sur les JAR JSON, mais ceux-ci sont cassés sur Maven Central (la classe JSONStringer est vide, elle ne définit qu'une méthode toString()). Si vous utilisez également Maven, vous pouvez résoudre ce problème en déployant le fichier androïde du SDK à l'aide de maven-android-sdk-deployer et en partant de là.

Voir this thread