【问题标题】:JSONArray error while connecting android to mobile db将android连接到移动数据库时出现JSONArray错误
【发布时间】:2012-01-12 19:53:32
【问题描述】:

我正在尝试使用 android 连接到我的在线数据库。在遵循教程后,我想出了这段代码:

package com.example.helloandroid;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.*;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class HelloAndroid extends Activity {
    JSONArray jArray;
    String result = null;
    InputStream is = null;
    StringBuilder sb=null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.1.4/~jasptack/Software%20engineering/connector.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
            }catch(Exception e){
                Log.e("log_tag", "Error in http connection"+e.toString());
           }

        //convert response to string
        try{
              BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
               sb = new StringBuilder();
               sb.append(reader.readLine() + "\n");
               String line="0";
               while ((line = reader.readLine()) != null) {
                              sb.append(line + "\n");
               }
               is.close();
               result=sb.toString();
               }catch(Exception e){
                      Log.e("log_tag", "Error converting result "+e.toString());
               }
      //parse json data
        try{
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag","x-co: "+json_data.getInt("x-coordinaat")+
                                ", straat: "+json_data.getString("straat")
                        );
                }
        }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }
}

执行此操作时,出现以下错误: 12-04 23:25:07.711:E/log_tag(353):解析数据时出错 org.json.JSONException:值

有人可以帮忙吗?谢谢!

【问题讨论】:

  • 请发布您从服务中获得的 JSON。可能是您的数组被包裹在对象内

标签: java php android sql


【解决方案1】:

如果 JSON 字符串格式错误,就会发生这种情况。确保String result 是有效的JSONArray(应该以'['开头)。此外,您可以尝试将result 映射到JSONObject。如果这些都很好,则JSONArray 中的元素之一格式不正确。

【讨论】:

    【解决方案2】:

    我曾经尝试解析我的 Web 服务返回的 JSON 字符串。这是我所做的:

    我从网络服务得到的响应是:

    {"checkrecord":[{"rollno":"abc2","percentage":40,"attended":12,"missed":34}],"Table1":[]}

    为了解析,我做了以下操作:

          JSONObject jsonobject = new JSONObject(result);
          JSONArray array = jsonobject.getJSONArray("checkrecord"); 
          int max = array.length();
          for (int j = 0; j < max; j++) 
       {
          JSONObject obj = array.getJSONObject(j);
          JSONArray names = obj.names();
    
         for (int k = 0; k < names.length(); k++) 
       {
          String name = names.getString(k);
          String value= obj.getString(name);  
    
       }
    

    我的 JSONObject 看起来像这样:

    {"Table1":[],"checkrecord":[{"missed":34,"attended":12,"percentage":40,"rollno":"abc2"}]}

    这就是@500865 试图提出的建议。我刚刚给你一个代码示例。首先检查您的结果并确定它是否有效。还要检查 JSONArray 结果。 如果可能,请在此处发布。

    希望对你有帮助

    干杯

    【讨论】:

    • 与网络服务本身的连接可能存在问题,因为当我记录结果变量(我将 sb.toString() 写入的位置)时,我得到了 phpfile 本身:wilma.vub.ac.be/~se3_1112/phpmyadmin","se3_1112","*********"); mysql_select_db("se3_1112"); $sql=mysql_query("select * from locatie"); while($row=mysql_fetch_assoc($sql) ) $output[]=$row; print(json_encode($output)); mysql_close(); ?>
    • 是的,如果是这样的话,我建议你先解决网络服务的问题,然后得到想要的结果。一旦你明白了,你就可以按照我在解析 JSON 的答案中解释的方式进行
    • 我解决了我的问题:一个错误的 php 文件导致了一些调试器没有检测到的问题,谢谢帮助:)
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2019-04-19
    • 2019-01-08
    • 2019-11-10
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多