0

我正在构建我的第一个 Android 应用程序,它需要从本地 Web 服务器中提取 JSON 格式的数据。Web 服务器已启动并正在运行,我可以在调试 Android 应用程序时看到返回的数据。但是,在尝试将数据解析为 JSON 数组时,我一直在代码的最后一行遇到 NullPointerException。

来电:


        JSONParserTask jParser = new JSONParserTask();
        ArrayList> ResultsList = new ArrayList>();
        EditText etSoNo = (EditText) findViewById(R.id.txtSoNo);
        //String url = "http://xxx.xxx.xxx.xxx/api/SOLocLookup/" + etSoNo.getText();
        String url = "http://headers.jsontest.com/";

        try{
            DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
            HttpGet httpget = new HttpGet(url);
            httpget.setHeader("Content-type", "application/json");
            httpget.setHeader("Accept", "JSON");

            InputStream inputStream = null;
            String result = null;

            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

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

            result = sb.toString();

            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            JSONArray jArray = new JSONArray(result);

起初我以为我的 API 可能没有发送 JSON 格式的响应,所以您可以看到我将调用更改为测试 JSON 服务:http ://headers.jsontest.com/

返回数据:

{ "Accept-Language": "en-US,en;q=0.8", "Host": "headers.jsontest.com", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8" }

我的日志猫:

09-26 18:08:30.977 61-214/system_process I/ActivityManager: 开始: Intent { cmp=com.evs.sodscamera/.activity.SoMatlLookup.SoMatlLookup } 来自 pid 1034 09-26 18:08:31.997 61-99 /system_process I/ActivityManager: 显示 com.evs.sodscamera/.activity.SoMatlLookup.SoMatlLookup: +913ms 09-26 18:09:11.748 1034-1034/com.evs.sodscamera D/dalvikvm: JDWP 调用返回 exceptObj=0x40589210 (Ljava/lang/NullPointerException;)

我真的很茫然。我确信它是如此简单,但由于我缺乏经验,我找不到它。

谢谢!!

-格雷格

更新1:

将 JSONArray 更改为 JSONObject 适用于从测试网站返回的数据。但是当我去检索我的原始数据时,它实际上存储为一个数组。我应该早点意识到这一点,而不是使用糟糕的测试数据发布。我很抱歉。

新返回数据:

[{"SoNo":119152.0,"SoLn":1.00,"ItemID":"7075SHA6016","ItemDesc":"7075-T6 ALCLAD SHEET .016\"","Size1":48.00000,"Size2":144.00000, "TagNo":62336.0,"Pcs":1.0,"Loc":"G0303"},{"SoNo":119152.0,"SoLn":1.00,"ItemID":"7075SHA6016","ItemDesc":"7075-T6 ALCLAD SHEET .016\"","Size1":48.00000,"Size2":144.00000,"TagNo":67931.0,"Pcs":124.0,"Loc":"G0303"},{"SoNo":119152.0,"SoLn ":1.00,"ItemID":"7075SHA6016","ItemDesc":"7075-T6 ALCLAD SHEET .016\"","Size1":48.00000,"Size2":48.00000,"TagNo":68912.0,"Pcs": 1.0,"Loc":"REM75"},{"SoNo":119152.0,"SoLn":1.00,"ItemID":"7075SHA6016","ItemDesc":"7075-T6 ALCLAD SHEET .016\"","Size1 ":48.00000,"Size2":144.00000,"TagNo":69589.0,"Pcs":177.0,"Loc":"RECVG"},{"SoNo":119152.0,"SoLn":1.00,"ItemID":"7075SHA6016 ","ItemDesc":"7075-T6 ALCLAD SHEET .016\"","Size1":48.00000,"Size2":48.00000,"TagNo":76493.0,"Pcs":1.0,"Loc":"REM75"} ,{"SoNo":119152.0,"SoLn":2.00,"ItemID":"2024SHA3125M","ItemDesc":"2024-T3 ALCLAD SHEET .125\"MRS","Size1":48.00000,"Size2":144.00000 ,"TagNo":72070.0,"Pcs":12.0,"Loc":"H0108"},{"SoNo":119152.0,"SoLn":3.00,"ItemID":"177SH-016","ItemDesc":"T17 /7 张 .016\"
AMS-5528","Size1":36.00000,"Size2":120.00000,"TagNo":70031.0,"Pcs":1.0,"Loc":"S0504"},{"SoNo":119152.0,"SoLn":3.00 ,"ItemID":"177SH-016","ItemDesc":"T17/7 SHEET .016\"","Size1":36.00000,"Size2":120.00000,"TagNo":76108.0,"Pcs":10.0, "Loc":""}]

谢谢!!

4

2 回答 2

1

改变这个

  JSONArray jArray = new JSONArray(result);

  JSONObject jobject = new JSONObject(result);

你得到的是一个 JSONObject

{ // represents json object node
   "Accept-Language": "en-US,en;q=0.8",
   "Host": "headers.jsontest.com",
   "Referer": "http://stackoverflow.com/questions/19036091/android-jsonarray-nullpointerexception-cannot-evaluate-jsonarray-tostring",
   "User-Agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.71 Chrome/28.0.1500.71 Safari/537.36",
   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}    

如果您从服务器获取 json,也可以使用线程或 Asynctask。所有与网络相关的操作都应该在一个线程上完成

于 2013-09-26T18:39:56.137 回答
0

您要解析的不是数组,它只是JSONObject.

JSON 中的数组用 [] 表示。例如,这将是一个数组:

[{"key": "value", "key2": "value2"}]

这是其中包含的单个对象:

{"key": "value", "key2": "value2"}
于 2013-09-26T18:39:47.530 回答