ねえ、1.5 から 2.2 までのすべての Android プラットフォーム (携帯電話とエミュレーターの両方) でオブジェクトを JSON にシリアル化しようとすると、非常に奇妙なエラーが発生します。
次のエラーが表示されます。
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
このコードでレビューをシリアル化するときに、「startModel()」から「stringer.object」の行に到達したとき:
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);
}
}
これに関する最も奇妙な点は、コードが正常にコンパイルされ、デバッグ時に JSONStringer オブジェクトが正常にインスタンス化されることですが、それを呼び出すとこのエラーがスローされます。また、Java のリフレクションを使用して、クラスが存在すること、およびクラス オブジェクトから取得できるメソッドがすべてそこにあり、エラーなしで呼び出すことができることを発見できます。
org.json パッケージは Android の標準であり、API バージョン 1 以降で利用できます。
どこを見ればいいのかわからないので、この問題を解決するための助けをいただければ幸いです。