【问题标题】:Error: org.json.JSONException: End of input at character 0 of错误:org.json.JSONException:在字符 0 处输入结束
【发布时间】:2015-11-26 19:25:12
【问题描述】:

我一直在玩一些 JSON,试图获取并显示要在 TextView 中显示的字符串。 我可以在浏览器中访问此 JSON 元素,但不能在我的 android 应用程序中访问。我正在执行,这是 logcat 输出:

     W/System.err: org.json.JSONException: End of input at character 0 of 
     W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
     W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
     W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:92)
     W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:108)
     W/System.err:     at com.bl.dbnewapp.ModelParser.parseFeed(ModelParser.java:17)
     W/System.err:     at com.bl.dbnewapp.MainActivity$MyTask.onPostExecute(MainActivity.java:103)
     W/System.err:     at com.bl.dbnewapp.MainActivity$MyTask.onPostExecute(MainActivity.java:89)
     W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:636)
     W/System.err:     at android.os.AsyncTask.access$500(AsyncTask.java:177)
     W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
     W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
     W/System.err:     at android.os.Looper.loop(Looper.java:135)
     W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5254)
     W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
     W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
     W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
     W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

这是 JSON:

[{"id":"1","name":"john"},{"id":"2","name":"ben"}]

这是我的模型类:

public class Model {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

这是 ModelParser 类:

public class ModelParser {
public static List<Model> parseFeed(String content) {

    try {
        JSONArray ar = new JSONArray(content);
        List<Model> modelList = new ArrayList<>();

        for (int i = 0; i < ar.length(); i++) {

            JSONObject obj = ar.getJSONObject(i);
            Model model = new Model();
            model.setName(obj.getString("name"));
            modelList.add(model);
        }

        return modelList;
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }
}
}

HttpManager:

public class HttpManager {
public static String getData(String uri) {

    BufferedReader reader = null;

    try {
        URL url = new URL(uri);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        StringBuilder sb = new StringBuilder();
        reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }

        return sb.toString();

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }

}
}

MainActivity:

public class MainActivity extends AppCompatActivity {
private static final String SO_URL = "http://www.example.com/webservice/?value=";
private static final String PARAMS = "[{%22table%22:%20%22names%22,%22operation%22:%20%22select%22}]";
TextView output;

List<MyTask> tasks;

List<Model> modelList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    output = (TextView) findViewById(R.id.textView);
    output.setMovementMethod(new ScrollingMovementMethod());
    tasks = new ArrayList<>();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == R.id.action_get_data) {
        if (isOnline()) {
            String  URL = null;
            try {
                URL = URLEncoder.encode(PARAMS, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            requestData(SO_URL + URL);
        } else {
            Toast.makeText(this, "Network isn't available", Toast.LENGTH_LONG).show();
        }
    }
    return false;
}

private void requestData(String uri) {
    MyTask task = new MyTask();
    task.execute(uri);
}

protected void updateDisplay() {

    if (modelList != null) {
        for (Model model : modelList) {
            output.append(model.getName() + "\n");
        }
    }

}

protected boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    } else {
        return false;
    }
}

private class MyTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        tasks.add(this);
    }

    @Override
    protected String doInBackground(String... params) {

        return HttpManager.getData(params[0]);
    }
    @Override
    protected void onPostExecute(String result) {
        modelList = ModelParser.parseFeed(result);
        updateDisplay();
        tasks.remove(this);

    }


}

}

我将不胜感激,我尝试了几乎所有方法来完成这项工作,但无济于事。

【问题讨论】:

  • 在您的parseFeed() 方法中,打印内容变量并查看实际解析的内容。从错误中,听起来字符串可能为空。
  • 是的,字符串为空
  • @keno 你认为问题出在服务器端吗?
  • 有可能。调试它的简单方法是通过 curl 手动执行请求并查看您得到的响应。
  • 因为我可以在浏览器上看到 JSON,但我无法在我的应用程序中检索它。这让我很困惑

标签: android json


【解决方案1】:

此问题已通过将%22 替换为\" 并在PARAMS 变量中删除%20 解决:PARAMS = "[{\"table\":\"names\",\"operation\":\"select\"}]" 感谢@keno 的提醒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多