java.lang.String无法强制转换为org.json.JSONObject

时间:2015-08-29 01:20:11

标签: android json object socket.io

我是Android的新手,我正在尝试创建一个应用程序,使用在后台服务上运行的socket.io,但我收到错误,无法在互联网上找到解决方案或我不明白这个问题因为我缺乏android(和对象)的经验。

mSocket.on("start tracking", new Emitter.Listener() {

            @Override
            public void call(final Object... args) {

                timer.scheduleAtFixedRate(new TimerTask() {
                 long t0 = System.currentTimeMillis();

                    @Override
                    public void run() {
                        JSONObject data = (JSONObject) args[0];
                        String id;
                        try {
                            id = data.getString("id");
                        } catch (JSONException e) {
                            return;
                        }
                        //cancel();
                        if (System.currentTimeMillis() - t0 > 60 * 1000) {
                            cancel();
                        } else {
                            //do my stuff
                            String deviceId = Settings.System.getString(getContentResolver(),
                                    Settings.System.ANDROID_ID);
                              if(id == deviceId){
                                mSocket.emit("emmitting location", deviceId, latitude, longitude);
                              }
                            }
                        }
                    }, 0, 1000);
            }
        });

修改 我没有意识到我没有通过我的服务器传递JSON对象。感谢@cybersam清理一切并耐心地解释整个情况。 :)

2 个答案:

答案 0 :(得分:1)

#include <stdio.h> int main() { int A[2][3]; int i,j; for(i=0;i<2;i++) { for(j=0;j<3;j++) { scanf("%d",&A[i][j]); } } for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%d ",A[i][j]); } printf("\n"); } } 不是来自String。因此,您需要将JSONObject实例转换为新的String实例。

试试这个:

JSONObject

[编辑]

另一方面,如果您的输入数据只是 mSocket.on("start tracking", new Emitter.Listener() { @Override public void call(final Object... args) { timer.scheduleAtFixedRate(new TimerTask() { long t0 = System.currentTimeMillis(); @Override public void run() { JSONObject data; String id; try { data = new JSONObject((String) args[0]); id = data.getString("id"); } catch (JSONException e) { return; } //cancel(); if (System.currentTimeMillis() - t0 > 60 * 1000) { cancel(); } else { //do my stuff String deviceId = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); mSocket.emit("emmitting location", deviceId, latitude, longitude); } } }, 0, 1000); } }); 而不是JSON字符串,请执行以下操作:

String

注意:您实际上从未在任何地方使用 mSocket.on("start tracking", new Emitter.Listener() { @Override public void call(final Object... args) { timer.scheduleAtFixedRate(new TimerTask() { long t0 = System.currentTimeMillis(); @Override public void run() { String id = (String) args[0]; //cancel(); if (System.currentTimeMillis() - t0 > 60 * 1000) { cancel(); } else { //do my stuff String deviceId = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); mSocket.emit("emmitting location", deviceId, latitude, longitude); } } }, 0, 1000); } }); ...

答案 1 :(得分:0)

Java似乎在如何处理JSONObject实例化中对字符串的强制转换方面有局限性。

因此,最好使用java String.valueOf()方法进行此类转换:

mSocket.on("start tracking", new Emitter.Listener() { 

    @Override 
    public void call(final Object... args) {

      timer.scheduleAtFixedRate(new TimerTask() {
            long t0 = System.currentTimeMillis();

            @Override 
            public void run() {
                JSONObject data;
                String id;
                try {
                    // Update conversion like this below
                    data = new JSONObject(String.valueOf(args[0]));
                    id = data.getString("id");
                } catch (JSONException e) {
                    return; 
                } 
                //cancel(); 
                if (System.currentTimeMillis() - t0 > 60 * 1000) {
                    cancel();
                } else { 
                    //do my stuff 
                    String deviceId = Settings.System.getString(getContentResolver(),
                            Settings.System.ANDROID_ID); 
                    mSocket.emit("emmitting location", deviceId, latitude, longitude);
                } 
            } 
        }, 0, 1000); 
    } 
});