Почему jsonObject имеет значение null? - PullRequest
0 голосов
/ 25 мая 2018

Сейчас я пытаюсь использовать приложение Android для доступа к удаленной базе данных на локальном сервере XAMPP.Приложение работает, фактически оно начинается с правильной активности.Но когда я пытаюсь получить доступ к базе данных, происходит сбой.В журнале сказано, что в строке 67 (то есть здесь:

 JSONObject jsonObject = httpJsonParser.makeHttpRequest(
            BASE_URL + "fetch_all_movies.php", "GET", null);
    try {
        int success = jsonObject.getInt(KEY_SUCCESS);) 

jsonObject = null. Итак, мой вопрос, в чем причина этого?

Воткоэффициент для синтаксического анализатора:

enter code here

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

import android.net.Uri;
import android.util.Log;

public class HttpJsonParser {

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

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

    try {
        Uri.Builder builder = new Uri.Builder();
        URL urlObj;
        String encodedParams = "";
        if (params != null) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.appendQueryParameter(entry.getKey(),     entry.getValue());
            }
        }
        if (builder.build().getEncodedQuery() != null) {
            encodedParams =  builder.build().getEncodedQuery();

        }
        if ("GET".equals(method)) {
            url = url + "?" + encodedParams;
            urlObj = new URL(url);
            urlConnection = (HttpURLConnection) urlObj.openConnection();
            urlConnection.setRequestMethod(method);


        } else {
            urlObj = new URL(url);
            urlConnection = (HttpURLConnection) urlObj.openConnection();
            urlConnection.setRequestMethod(method);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            urlConnection.setRequestProperty("Content-Length", String.valueOf(encodedParams.getBytes().length));
            urlConnection.getOutputStream().write(encodedParams.getBytes());
        }


        urlConnection.connect();
        is = urlConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new     InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
        jObj = new JSONObject(json);


    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    } catch (Exception e) {
        Log.e("Exception", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

}

Вот код для класса листинга:

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.lukas.remotemysqlconnection.helper.CheckNetworkStatus;
import com.example.lukas.remotemysqlconnection.helper.HttpJsonParser;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MovieListingActivity extends AppCompatActivity {
private static final String KEY_SUCCESS = "success";
private static final String KEY_DATA = "data";
private static final String KEY_MOVIE_ID = "movie_id";
private static final String KEY_MOVIE_NAME = "movie_name";
private static final String BASE_URL = "http://192.168.0.169/movies/";
private ArrayList<HashMap<String, String>> movieList;
private ListView movieListView;
private ProgressDialog pDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movie_listing);
    movieListView = (ListView) findViewById(R.id.movieList);
    new FetchMoviesAsyncTask().execute();

}

/**
 * Fetches the list of movies from the server
 */
private class FetchMoviesAsyncTask extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Display progress bar
        pDialog = new ProgressDialog(MovieListingActivity.this);
        pDialog.setMessage("Loading movies. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        HttpJsonParser httpJsonParser = new HttpJsonParser();
        JSONObject jsonObject = httpJsonParser.makeHttpRequest(
                BASE_URL + "fetch_all_movies.php", "GET", null);
        try {
            int success = jsonObject.getInt(KEY_SUCCESS);
            JSONArray movies;
            if (success == 1) {
                movieList = new ArrayList<>();
                movies = jsonObject.getJSONArray(KEY_DATA);
                //Iterate through the response and populate movies list
                for (int i = 0; i < movies.length(); i++) {
                    JSONObject movie = movies.getJSONObject(i);
                    Integer movieId = movie.getInt(KEY_MOVIE_ID);
                    String movieName = movie.getString(KEY_MOVIE_NAME);
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(KEY_MOVIE_ID, movieId.toString());
                    map.put(KEY_MOVIE_NAME, movieName);
                    movieList.add(map);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();

}

Все phpфайлы находятся в указанной папке в каталоге xamm / htdocs / movies /...

Вот db_connect для php:

  <?php
  define('DB_USER', "root"); // db user
  define('DB_PASSWORD', ""); // db password (mention your db password here)
  define('DB_DATABASE', "androiddeft"); // database name
  define('DB_SERVER', "localhost"); // db server

  $con = mysqli_connect(DB_SERVER,DB_USER,DB_PASSWORD,DB_DATABASE);

  // Check connection
  if(mysqli_connect_errno()){
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
  ?>

Последнее, но не менее важное, вот файл php:

 <?php
 include 'db/db_connect.php';
 //Query to select movie id and movie name
 $query = "SELECT movie_id, movie_name FROM movies";
 $result = array();
 $movieArray = array();
 $response = array();
 //Prepare the query
 if($stmt = $con->prepare($query)){
$stmt->execute();
//Bind the fetched data to $movieId and $movieName
$stmt->bind_result($movieId,$movieName);
//Fetch 1 row at a time                 
while($stmt->fetch()){
    //Populate the movie array
    $movieArray["movie_id"] = $movieId;
    $movieArray["movie_name"] = $movieName;
    $result[]=$movieArray;

}
$stmt->close();
$response["success"] = 1;
$response["data"] = $result;


 }else{
//Some error while fetching data
$response["success"] = 0;
$response["message"] = mysqli_error($con);


 }
 //Display JSON response
 echo json_encode($response);

 ?>

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Сначала напечатайте и проверьте формат ответа JSON на https://jsoneditoronline.org/

, затем проверьте, существует ли выбранный вами объект JSON или нет, используя метод jsonobject.has ("key").

0 голосов
/ 25 мая 2018

Вы не отправляете JSON.Если вы посмотрите, вы обнаружите, что тип контента application/html.

Исправьте это, установив заголовок Content_Type:

header('Content-Type: application/json');
echo json_encode($response);

Это может быть не вашей фактической ошибкой, но выследует сделать это в любом случае, чтобы исключить эту возможность, поскольку это правильный способ доставки JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...