【问题标题】:org.json.JSONException: End of input at characterorg.json.JSONException:字符输入结束
【发布时间】:2012-12-11 18:58:48
【问题描述】:

当我尝试获取没有对象的 json 时,它工作正常。但是当我尝试获取具有对象的 json 时,它会出错。

你有什么想法吗?

protected Void doInBackground(String... params) {

    String url = "http://example.com/adchara1/";
    JSONArray data = null;

    try {
        JSONObject jsonObject = new JSONObject(result);

        MyArrList = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> map;
        data = jsonObject.getJSONArray("countries");
        data = new JSONArray(getJSONUrl(url));
        for (int i = 0; i < data.length(); i++) {
            JSONObject c = data.getJSONObject(i);
            map = new HashMap<String, Object>();

            // Thumbnail Get ImageBitmap To Object
            map.put("photo", (String) c.getString("photo"));
            map.put("ImageThumBitmap",(Bitmap) loadBitmap(c.getString("photo")));

            // Full (for View Popup)
            map.put("frame", (String) c.getString("frame"));

            MyArrList.add(map);
        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}

错误

12-26 11:51:10.352: W/System.err(23284): org.json.JSONException: End of input at character 0 of 
12-26 11:51:10.368: W/System.err(23284):    at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
12-26 11:51:10.368: W/System.err(23284):    at org.json.JSONTokener.nextValue(JSONTokener.java:97)
12-26 11:51:10.368: W/System.err(23284):    at org.json.JSONObject.<init>(JSONObject.java:154)
12-26 11:51:10.368: W/System.err(23284):    at org.json.JSONObject.<init>(JSONObject.java:171)
12-26 11:51:10.376: W/System.err(23284):    at com.example.gridview.MainActivity$DownloadJSONFileAsync.doInBackground(MainActivity.java:180)
12-26 11:51:10.376: W/System.err(23284):    at com.example.gridview.MainActivity$DownloadJSONFileAsync.doInBackground(MainActivity.java:1)
12-26 11:51:10.376: W/System.err(23284):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-26 11:51:10.376: W/System.err(23284):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-26 11:51:10.376: W/System.err(23284):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-26 11:51:10.376: W/System.err(23284):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-26 11:51:10.376: W/System.err(23284):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-26 11:51:10.376: W/System.err(23284):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-26 11:51:10.376: W/System.err(23284):    at java.lang.Thread.run(Thread.java:856)
12-26 11:51:10.399: D/libEGL(23284): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
12-26 11:51:10.423: D/libEGL(23284): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
12-26 11:51:10.430: D/libEGL(23284): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
12-26 11:51:10.516: D/OpenGLRenderer(23284): Enabling debug mode 0
12-26 11:51:10.735: D/AndroidRuntime(23284): Shutting down VM
12-26 11:51:10.735: W/dalvikvm(23284): threadid=1: thread exiting with uncaught exception (group=0x4158f300)
12-26 11:51:10.735: E/AndroidRuntime(23284): FATAL EXCEPTION: main
12-26 11:51:10.735: E/AndroidRuntime(23284): java.lang.NullPointerException
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.example.gridview.MainActivity$ImageAdapter.getCount(MainActivity.java:122)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.widget.GridView.setAdapter(GridView.java:182)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.example.gridview.MainActivity.ShowAllContent(MainActivity.java:91)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.example.gridview.MainActivity$DownloadJSONFileAsync.onPostExecute(MainActivity.java:209)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.example.gridview.MainActivity$DownloadJSONFileAsync.onPostExecute(MainActivity.java:1)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.os.AsyncTask.finish(AsyncTask.java:631)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.os.Looper.loop(Looper.java:137)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at android.app.ActivityThread.main(ActivityThread.java:4931)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at java.lang.reflect.Method.invokeNative(Native Method)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at java.lang.reflect.Method.invoke(Method.java:511)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
12-26 11:51:10.735: E/AndroidRuntime(23284):    at dalvik.system.NativeStart.main(Native Method)
12-26 11:51:12.509: I/Process(23284): Sending signal. PID: 23284 SIG: 9

【问题讨论】:

  • 看起来你在 MainActivity 第 122 行有 NullPointerException。它清楚地表明问题出在 getCount()
  • @AndroSelva 看到这个并告诉我pastebin.com/mNVGEnD5
  • 您确定您的 JSON 格式正确吗?使用 jsonviewer.stack.hu 看看它是否验证。
  • @AndroidKiller 我的格式不好。看到这个pastie.org/5579002
  • @kongkea 很好,但有点太长了。 :p

标签: android arrays json


【解决方案1】:

改变

 JSONObject jsonObject = new JSONObject(result);

result=getJSONUrl(url);  //<< get json string from server
JSONObject jsonObject = new JSONObject(result);

DownloadJSONFileAsyncdoInBackground 方法中,因为目前您没有发布任何从服务器获取 Json 数据的帖子,只是尝试将空字符串解析为 json

【讨论】:

  • 它可以工作但不显示任何内容。它说不能 JSONObject 不能转换为 JSONArray
  • @kongkea :因为您正在下载所有图像和 json,然后在 GridView 中显示。解决方案是使用延迟加载更改代码以显示来自网络的图像,并将图像 URL 存储在 Map 和适配器的 getView 方法中尝试下载需要 imagesloadBitmap
  • 你能给我一些简单的吗?或者你有没有关于 Gridview 使用 AsyncTask 和 Universal-Image-Loader 从 JSON 获取图像的教程?
【解决方案2】:

正如您在this answer 中看到的那样,您可能会得到一个空白响应。
一般来说,org.json.JSONException: End of input at character N of... 意味着无法解析 JSON 并且某些事情没有正确完成。

如果问题是您收到空白响应,则应确保在尝试解析之前从服务器获得响应(如 ρяσѕρєя K 的回答)。

如果问题是错误的 JSON,您应该尝试验证它。 JSONLint 是一个很好的起点。

【讨论】:

    【解决方案3】:

    我没有看到您在此 String result = ""; 之后在此处为 pastebin.com/mNVGEnD5 分配任何结果 如果你试图用这个来获取 json 对象

    JSONObject jsonObject = new JSONObject(result);
    

    它肯定会在字符 0 处返回输入结尾,因为字符串结果为空 也许您可以尝试用一些 jsonString 替换它,您可以以此为例:

    {
        "result": "OK",
        "member_id": "32",
        "first_name": "Android",
        "last_name": "JSON",
        "nickname": "HEY",
        "accesskey": "123556332",
        "facebook_id": "0",
        "facebook_token_expire_date": "0000-00-00 00:00:00",
        "facebook_token_expire_date2": "0000000000000",
        "facebook_token_refresh_date": "0000-00-00 00:00:00",
        "facebook_token_key": "null",
        "status_active": 1 
    }
    

    【讨论】:

    • 我分配了字符串 result="";并且还在做 JSONObject jsonObject = new JSONObject(result);仍然出错
    【解决方案4】:

    请检查浏览器中的PHP文件URL如果获取数据意味着你在android端有问题如果浏览器没有显示数据则意味着PHP文件有问题。

    【讨论】:

      【解决方案5】:

      -请检查您所有的 json veriables 是否正确返回 json 格式。

      【讨论】:

        【解决方案6】:
        JSONArray array=    new JSONArray(resultdata);
                    for(int i=0;i<array.length();i++)
                     {                  
                        carid.add(jsonObject.getString("Id"));
                        carlogo.add(jsonObject.getString("CarImage"));
                        carname.add(jsonObject.getString("CarType"));
                        prize.add(jsonObject.getString("Price"));
                        availibility.add(jsonObject.getString("CarAvailable"));}
        

        【讨论】:

        • 你可以使用这种方式,或者你必须创建 custonclass 并且可以从服务器添加所有数据
        【解决方案7】:

        最好用 optJSONObject 而不是 getJSONObject 因为它不会通过异常。

        【讨论】:

          【解决方案8】:

          有时问题是 URL,如果你的网站强制 HTTPS,你必须确保你使用的是 HTTPS URL你的APP

          String url = "https://example.com/adchara1/";

          【讨论】:

            【解决方案9】:
            carid = new ArrayList<String>();
                    carlogo = new ArrayList<String>();
                    carname = new ArrayList<String>();
                    prize = new ArrayList<String>();
                    availibility = new ArrayList<String>();
            
                    ListView carlist=(ListView)findViewById(R.id.listcardetails);
                    adapter=new CustomAdapter(this, carid, carlogo, carname, prize, availibility);
                    carlist.setAdapter(adapter);
            

            【讨论】:

            • 这与问题有什么关系?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多