解析数据时出错org.json.JSONException:值<br/>

时间:2014-04-07 15:52:06

标签: java android json

我正在尝试根据ListView中按下的项目显示信息。我正在使用HTTP GET请求来获取信息。

当您单击ListView中的项目(配置文件)时,应用程序将获取该配置文件名称,并且根据它应该在下一个活动中显示该配置文件的信息,但这不起作用,我不断收到JSONException错误。我不知道是什么造成的,或者如果我的方法是错误的,任何帮助都会很棒。感谢。

在这里,我将个人资料的名称发送到下一个活动(此类有更多代码,但与此问题无关):

public class EditProfiles extends BaseListActivity实现了GetProfilesListener {

TextView errorMessage;
String email;

private static final String TAG_PNAME = "profilename";


/**
 * Called when activity is first created.
 */
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_profiles);


ListView list = getListView();
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,                   
                int position, long id) {
            // getting values from selected ListItem
            String profilename = ((TextView) view.findViewById(R.id.editProfiles_profile_name)).getText()
                    .toString();

            Intent in = new Intent(getApplicationContext(), EditSingleProfile.class);

            // sending profilename to next activity
            in.putExtra(TAG_PNAME, profilename);

            // Starts activity 
            startActivity(in);

        }

    });

}

这是我想从个人资料中获取详细信息的活动:

public class EditSingleProfile extends BaseViewEditProfile{

Spinner inputType;
EditText inputName;
EditText inputAge;
EditText inputBreed;
EditText inputAbout;
ImageView selectPicture;
Button change;
TextView message;

//Json node names.
private static final String TAG_SUCCESS = "success";
private static final String TAG_PROFILE = "profile";
private static final String TAG_PNAME = "profilename";
private static final String TAG_PAGE = "petage";
private static final String TAG_BREED = "petbreed";
private static final String TAG_ABOUT = "profileabout";

//JSON parser class
JSONParser jsonParser = new JSONParser();

// single profile url
private static final String url_profile_details = "http://gatoandroidapp.comeze.com/profile_details.php";

//Create field SELECT_PICTURE to be used in the class.
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
String pimage;
String profilename;

    /**
     * Called when activity is created.
     */
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_profile_view);  
         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

        // getting profile details from intent
        Intent i = getIntent();

        // getting profile name from intent
        profilename = i.getStringExtra(TAG_PNAME);

        // Sets view title.
        this.setTitle(profilename);

        // Get profile's details in Background Thread
        new GetProfiles().execute();

               /**
         * Background AsyncTask to Get profile details.
         */
        class GetProfiles extends AsyncTask<String, String, String> {

            // Progress Dialog
            private ProgressDialog pDialog;
            /**
             * Before starting background thread Show Progress Dialog
             */
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(EditSingleProfile.this);
                pDialog.setMessage("Loading profile details...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            /**
             * Getting profile details in background thread
             */
            protected String doInBackground(String... params) {

                // updating UI from Background Thread
                runOnUiThread(new Runnable() {
                    public void run() {
                        // Check for success tag
                        int success;
                        try {
                            // Building Parameters
                            List<NameValuePair> params = new ArrayList<NameValuePair>();
                            params.add(new BasicNameValuePair("profilename", profilename));

                            // getting profile details by making HTTP request
                            JSONObject json = jsonParser.makeHttpRequest(
                                    url_profile_details, "GET", params);

                            // check your log for json response
                            Log.d("Single Profile Details", json.toString());

                            // json success tag
                            success = json.getInt(TAG_SUCCESS);
                            if (success == 1) {
                                // successfully received product details
                                JSONArray profileObj = json
                                        .getJSONArray(TAG_PROFILE); // JSON Array

                                // get first profile object from JSON Array
                                JSONObject profile = profileObj.getJSONObject(0);

                                inputName = (EditText) findViewById(R.id.editProfile_profileName_editText);
                                inputAge = (EditText) findViewById(R.id.editProfile_age_editText);
                                inputBreed = (EditText) findViewById(R.id.editProfile_breed_editText);
                                inputAbout = (EditText) findViewById(R.id.editProfile_about_editText);

                                // display product data in EditText
                                inputName.setText(profile.getString(TAG_PNAME));
                                inputAge.setText(profile.getString(TAG_PAGE));
                                inputBreed.setText(profile.getString(TAG_BREED));
                                inputAbout.setText(profile.getString(TAG_ABOUT));

                            }else{
                                // profile with name not found
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

                return null;
            }

            /**
             * After completing background task Dismiss the progress dialog.
             */
            protected void onPostExecute(String file_url) {
                // dismiss the dialog once got all details
                pDialog.dismiss();
            }
        }

这是我的JSON解析器:

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // Making HTTP request
    try {

        // check for request method
        if(method.equalsIgnoreCase("POST")){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method.equalsIgnoreCase("GET")){
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }           


    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

这是我的PHP代码:

<?php

/*
 * Gets single profile details
 * A profile is identified by profile name (pname)
 */

// array for JSON response
$response = array();


// include db connect class
require_once __DIR__ . '/DB_Connect.php';

// connecting to db
$db = new DB_CONNECT();

// check for post data
if (isset($_GET["profilename"])) {
    $profilename = $_GET['profilename'];

    // get a profile from profiles table
    $result = mysql_query("SELECT * FROM profiles WHERE profilename = $profilename");

    if (!empty($result)) {
        // check for empty result
        if (mysql_num_rows($result) > 0) {

            $result = mysql_fetch_array($result);

            $profile = array();
            $profile["profilename"] = $result["profilename"];
            $profile["petage"] = $result["petage"];
            $profile["petbreed"] = $result["petbreed"];
            $profile["profileabout"] = $result["profileabout"];

            // success
            $response["success"] = 1;

            // user node
            $response["profile"] = array();

            array_push($response["profile"], $profile);

            // echoing JSON response
            echo json_encode($response);
        } else {
            // no profile found
            $response["success"] = 0;
            $response["message"] = "No profile found";

            // echo no users JSON
            echo json_encode($response);
        }
    } else {
        // no profile found
        $response["success"] = 0;
        $response["message"] = "No profile found";

        // echo no users JSON
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

这是错误日志:

04-07 16:22:00.156: E/JSON Parser(15588): Error parsing data org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject
04-07 16:22:00.156: D/AndroidRuntime(15588): Shutting down VM
04-07 16:22:00.156: W/dalvikvm(15588): threadid=1: thread exiting with uncaught exception (group=0x4123f908)
04-07 16:22:00.159: E/AndroidRuntime(15588): FATAL EXCEPTION: main
04-07 16:22:00.159: E/AndroidRuntime(15588): java.lang.NullPointerException
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.gmail.lucsantisf.software_project.views.EditSingleProfile$GetProfiles$1.run(EditSingleProfile.java:249)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Handler.handleCallback(Handler.java:615)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Looper.loop(Looper.java:153)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.app.ActivityThread.main(ActivityThread.java:5006)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at java.lang.reflect.Method.invokeNative(Native Method)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at java.lang.reflect.Method.invoke(Method.java:511)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at dalvik.system.NativeStart.main(Native Method)

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

我修正了错误,问题与PHP文件中的连接和此行有关:require_once DIR 。 '/DB_Connect.php' ;.

我使用了Log.d(“JSON Parser”,json);在eclipse中读取logcat中的PHP错误并且它一直告诉我无法打开流:没有这样的文件或目录并且无法打开需要所以我把所需的文件放在与我的php文件相同的目录中并且在php文件中替换了这一行: require_once _ DIR _。 '/DB_Connect.php'; 与此: require_once 'DB_Connect.php ';

如果有人试图做类似的事情,那么java代码是完美的。

答案 1 :(得分:0)

看起来你得到的回复是无效的JSON。 Value <br><table of type java.lang.String表示您获取的HTML代码作为无法映射到对象的响应。

尝试做

Log.d("JSON Parser", json);

在您的评论// try parse the string to a JSON object

之前

答案 2 :(得分:0)

使用Logcat输出您请求的URL并尝试可视化响应,并注意符号和标签,如&lt; /&gt;,他们应该被转义。可能是解析器遇到了一个数组而你要告诉它转换为一个对象。

答案 3 :(得分:0)

此错误可能是因为当您执行PHP代码时出现此错误:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

它通过JSON获得此错误:

<br>Deprecated</br>...

所以,如果你输入这样的PHP代码:

error_reporting(E_ALL ^ E_DEPRECATED);

此错误将被修复。