2010-08-25 34 views
5

Heya, tôi nhận được một lỗi rất lạ mà tôi không thể phân loại khi cố gắng sắp xếp các đối tượng vào JSON trên tất cả các nền tảng Android, từ 1,5 đến 2,2 (cả trên điện thoại và trình mô phỏng).NoMethodError trên đối tượng thời gian chạy Android chuẩn

tôi nhận được lỗi này:

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 

khi đến dòng 'stringer.object' từ 'startModel()' khi tuần tự đánh giá trong mã này:

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

Điều lạ lùng nhất về điều này là mã biên dịch tốt, và khi gỡ lỗi, đối tượng JSONStringer được khởi tạo ok, nhưng bất kỳ lời gọi nào để nó ném lỗi này. Tôi cũng có thể, bằng cách sử dụng sự phản chiếu của Java, phát hiện ra rằng lớp đó tồn tại, và các phương thức tôi có thể lấy từ đối tượng lớp là tất cả ở đó, và có thể được gọi mà không có lỗi.

Gói org.json là một tiêu chuẩn trong Android, và đã có sẵn từ phiên bản API 1.

Bất kỳ sự giúp đỡ để giải quyết vấn đề này sẽ được đánh giá, như tôi chỉ đơn giản là không biết nơi để tìm.

+0

chỉ để thêm vào sự nhầm lẫn: điều buồn cười là * deserializing * khi sử dụng 'lớp org.json' hoạt động tốt ... các lỗi này chỉ đưa ra khi * serializing * đối tượng. – Matthias

Trả lời

4

Hóa ra đó là sự cố với Android JAR từ Maven Central. Nó có một sự phụ thuộc vào các JSON JAR, nhưng chúng bị phá vỡ trên Maven Central (lớp JSONStringer rỗng, chỉ định nghĩa một phương thức toString()).

Nếu bạn cũng đang sử dụng Maven, bạn có thể khắc phục điều này bằng cách triển khai jar Android của SDK bằng cách sử dụng maven-android-sdk-deployer và đi từ đó.

Xem this thread

Các vấn đề liên quan