错误:org.json.JSONException:没有bog的值

时间:2017-11-10 10:00:14

标签: java php android json

我的代码有问题。我似乎无法找到问题所在。我写了一些类似的代码,实际上它是相同的,只有变量才是变量名。我收到以下错误:

org.json.JSONException: No value for bog
org.json.JSONObject.get(JSONObject.java:389)
org.json.JSONObject.getJSONArray(JSONObject.java:584)

我制作了一个Android应用程序,它连接到用PHP编写的REST API。当我在邮递员中测试它时,api功能没有问题。所以,我认为问题必须是java代码。我使用过本教程:https://www.simplifiedcoding.net/android-mysql-tutorial-to-perform-basic-crud-operation/#Why-PHP-and-MySQL-and-Why-Not-SQLite

此外,我可以写入我的数据库,但是当我尝试从中读取数据时会出现问题。

我的代码:

 package com.example.android.bookdb;


    import android.content.DialogInterface;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.Toast;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;

    import static android.view.View.GONE;


    public class MainActivity extends AppCompatActivity {

    private static final int CODE_GET_REQUEST = 1024;
    private static final int CODE_POST_REQUEST = 1025;

    EditText editTextBogID, editTextTitel, editTextBogBeskrivelse, editTextISBN,
            editTextForfatter, editTextGenre,
            editTextSprog;;
    ProgressBar progressBar;
    ListView listView;
    Button buttonAddUpdate;

    List<Bog> bogList;

    boolean isUpdating = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        editTextBogID = (EditText) findViewById(R.id.editTextBogID);
        editTextTitel = (EditText) findViewById(R.id.editTextTitel);
        editTextBogBeskrivelse = (EditText) findViewById(R.id.editTextBogBeskrivelse);
        editTextISBN = (EditText) findViewById(R.id.editTextISBN);
        editTextForfatter = (EditText) findViewById(R.id.editTextForfatter);
        editTextGenre = (EditText) findViewById(R.id.editTextGenre);
        editTextSprog = (EditText) findViewById(R.id.editTextSprog);
        buttonAddUpdate = (Button) findViewById(R.id.buttonAddUpdate);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        listView = (ListView) findViewById(R.id.listHentBog);


        bogList = new ArrayList<>();



        buttonAddUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isUpdating) {
                    opdaterBog();
                } else {
                    opretBog();
                }
            }
        });
        hentBog();
    }



    private void opretBog() {
        String Titel = editTextTitel.getText().toString().trim();
        String Beskrivelse = editTextBogBeskrivelse.getText().toString().trim();
        String ISBN = editTextISBN.getText().toString().trim();
        String Forfatter = editTextForfatter.getText().toString().trim();
        String Genre = editTextGenre.getText().toString().trim();
        String Sprog = editTextSprog.getText().toString().trim();


        if (TextUtils.isEmpty(Titel)) {
            editTextTitel.setError("Skriv venligst navnet på bogen");
            editTextTitel.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Beskrivelse)) {
            editTextBogBeskrivelse.setError("Skriv venligst beskrivelse");
            editTextBogBeskrivelse.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(ISBN)) {
            editTextISBN.setError("Skriv venligst ISBN-nummeret");
            editTextISBN.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Forfatter)) {
            editTextForfatter.setError("Skriv venligst navnet på forfatteren");
            editTextForfatter.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Genre)) {
            editTextGenre.setError("Skriv venligst bog genren");
            editTextGenre.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Sprog)) {
            editTextSprog.setError("Skriv venligst sproget på bogen");
            editTextSprog.requestFocus();
            return;
        }



        HashMap<String, String> params = new HashMap<>();
        params.put("Titel", Titel);
        params.put("Beskrivelse", Beskrivelse);
        params.put("Forfatter", Forfatter);
        params.put("ISBN", ISBN);
        params.put("Genre", Genre);
        params.put("Sprog", Sprog);




        PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_OPRET_BOG, params, CODE_POST_REQUEST);
        request.execute();
    }

    private void hentBog() {
        PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_HENT_BOG, null, CODE_GET_REQUEST);
        request.execute();
    }


    private void opdaterBog() {
        String id = editTextBogID.getText().toString().trim();
        String Titel = editTextTitel.getText().toString().trim();
        String Beskrivelse = editTextBogBeskrivelse.getText().toString().trim();
        String ISBN = editTextISBN.getText().toString().trim();
        String Forfatter = editTextForfatter.getText().toString().trim();
        String Genre = editTextGenre.getText().toString().trim();
        String Sprog = editTextSprog.getText().toString().trim();



        if (TextUtils.isEmpty(Titel)) {
            editTextTitel.setError("Skriv venligst navnet på bogen");
            editTextTitel.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Beskrivelse)) {
            editTextBogBeskrivelse.setError("Skriv venligst beskrivelse");
            editTextBogBeskrivelse.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(ISBN)) {
            editTextISBN.setError("Skriv venligst ISBN-nummeret");
            editTextISBN.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Forfatter)) {
            editTextForfatter.setError("Skriv venligst navnet på forfatteren");
            editTextForfatter.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Genre)) {
            editTextGenre.setError("Skriv venligst bog genren");
            editTextGenre.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(Sprog)) {
            editTextSprog.setError("Skriv venligst sproget på bogen");
            editTextSprog.requestFocus();
            return;
        }



        HashMap<String, String> params = new HashMap<>();
        params.put("id", id);
        params.put("Titel", Titel);
        params.put("Beskrivelse", Beskrivelse);
        params.put("Forfatter", Forfatter);
        params.put("ISBN", ISBN);
        params.put("Genre", Genre);
        params.put("Sprog", Sprog);




        PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_OPDATER_BOG, params, CODE_POST_REQUEST);
        request.execute();

        buttonAddUpdate.setText("Tilføj");

        editTextTitel.setText("");
        editTextBogBeskrivelse.setText("");
        editTextForfatter.setText("");
        editTextISBN.setText("");
        editTextGenre.setText("");
        editTextSprog.setText("");


        isUpdating = false;
    }

    private void sletBog(int id) {
        PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_SLET_BOG + id, null, CODE_GET_REQUEST);
        request.execute();
    }

    private void opdaterBogList(JSONArray bog) throws JSONException {
        bogList.clear();

        for (int i = 0; i < bog.length(); i++) {
            JSONObject obj = bog.getJSONObject(i);

            bogList.add(new Bog(
                    obj.getInt("id"),
                    obj.getString("Titel"),
                    obj.getString("Beskrivelse"),
                    obj.getString("ISBN"),
                    obj.getString("Forfatter"),
                    obj.getString("Genre"),
                    obj.getString("Sprog")

            ));
        }

        BogAdapter adapter = new BogAdapter(bogList);
        listView.setAdapter(adapter);
    }


    private class PerformNetworkRequest extends AsyncTask<Void, Void, String> {
        String url;
        HashMap<String, String> params;
        int requestCode;

        PerformNetworkRequest(String url, HashMap<String, String> params, int requestCode) {
            this.url = url;
            this.params = params;
            this.requestCode = requestCode;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            progressBar.setVisibility(GONE);
            try {
                JSONObject object = new JSONObject(s);
                if (!object.getBoolean("error")) {
                    Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
                    opdaterBogList(object.getJSONArray("bog"));

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected String doInBackground(Void... voids) {
            RequestHandler requestHandler = new RequestHandler();

            if (requestCode == CODE_POST_REQUEST)
                return requestHandler.sendPostRequest(url, params);


            if (requestCode == CODE_GET_REQUEST)
                return requestHandler.sendGetRequest(url);

            return null;
        }
    }

    class BogAdapter extends ArrayAdapter<Bog> {
        List<Bog> bogList;

        public BogAdapter(List<Bog> bogList) {
            super(MainActivity.this, R.layout.layout_bog_list, bogList);
            this.bogList = bogList;
        }


        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View listViewEnhed = inflater.inflate(R.layout.layout_bog_list, null, true);

            TextView textViewTitel = listViewEnhed.findViewById(R.id.textViewTitel);

            TextView textViewOpdater = listViewEnhed.findViewById(R.id.textViewOpdater);
            TextView textViewSlet = listViewEnhed.findViewById(R.id.textViewSlet);

            final Bog bog = bogList.get(position);

            textViewTitel.setText(bog.hentTitel());

            textViewOpdater.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    isUpdating = true;
                    editTextBogID.setText(String.valueOf(bog.hentId()));
                    editTextTitel.setText(bog.hentTitel());
                    editTextBogBeskrivelse.setText(bog.hentBeskrivelse());
                    editTextISBN.setText(bog.hentISBN());
                    editTextForfatter.setText(bog.hentForfatter());
                    editTextGenre.setText(bog.hentGenre());
                    editTextSprog.setText(bog.hentSprog());
                    buttonAddUpdate.setText("Opdater");
                }
            });

            textViewSlet.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                    builder.setTitle("Slet " + bog.hentTitel())
                            .setMessage("Er du sikker?")
                            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    sletBog(bog.hentId());
                                }
                            })
                            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {

                                }
                            })
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .show();

                }
            });

            return listViewEnhed;
        }
    }
}

但是,以防万一,这是我的Api代码:

// Henter DbOperation klassen.
require_once 'DbOperation.php';

 // Funktionen vil validere om alle parametrene er tilgængelige.
 // Vi vil sende de påkrævede parametre til denne funktion. 
    function isTheseParametersAvailable($params){
        // Hvis all parametrene er tilgængelige.
    $available = true; 
    $missingparams = ""; 

    foreach($params as $param){
        if(!isset($_POST[$param]) || strlen($_POST[$param])<=0){
            $available = false; 
            $missingparams = $missingparams . ", " . $param; 
        }
    }

     // Hvis der mangler parametre.
    if(!$available){
        $response = array(); 
        $response['error'] = true; 
        $response['message'] = 'Parameters ' . substr($missingparams, 1, strlen($missingparams)) . ' missing';

         // Fremviser fejl
        echo json_encode($response);

        // Dropper yderligere eksekveringer.
        die();
    }
}

// Et array som står for at vise svar.
$response = array();

// Hvis det er et API-kald
// Hvilket vil sige, at et "GET" parametre ved navn: "apicall" er placeret i URL'en.
// Og med den parametre, kan vi konkludere, at der er tale om et API-kald.
if(isset($_GET['apicall'])){

    switch($_GET['apicall']){

        //opretbog operationen
        // Hvis API-kald værdien er: "opretbog".
        // Så vil vi oprette bogen i databasen.
        case 'opretbog':
            // Vi tjekker først om parametrene for forespørgslen er tilgængelige eller ej.
            isTheseParametersAvailable(array('Titel', 'Beskrivelse', 'ISBN', 'Forfatter', 'Genre', 'Sprog'));

            // Opretter et nyt DbOperation objekt
            $db = new DbOperation();

            // Opretter en ny bog i databasen.
            $result = $db->opretBog(
                $_POST['Titel'],
                $_POST['Beskrivelse'],
                $_POST['ISBN'],
                $_POST['Forfatter'],
                $_POST['Genre'],
                $_POST['Sprog']

            );


            // Når bogen bliver oprettet, får vi følgende svar: Bogen er tilføjet. Ellers får vi beskeden: Fejl.
            if($result){
                //Når bogen bliver tilføjet, er der ingen fejl.
                $response['error'] = false; 

                // Her har vi en besked med indholdet: "Bogen er tilføjet".
                $response['message'] = 'Bogen er tilføjet';

                // Her bliver alle bøgerne fra databasen hentet, som svar.
                $response['Bogen'] = $db->hentBog();
            }else{

                 //Hvis bogen ikke bliver tilføjet, så har vi en fejl.
                $response['error'] = true; 

                // Her har vi fejlbeskeden.
                $response['message'] = 'Fejl';
            }

        break; 

                // Hent operationen:
                // Hvis API-kaldet er hentbog.
        case 'hentbog':
            $db = new DbOperation();
            $response['error'] = false; 
            $response['message'] = 'Fuldført';
            $response['Bogen'] = $db->hentBog();
        break; 


             // Opdater operationen:
             // Hvis API-kaldet er opdaterBog.
        case 'opdaterbog':
            isTheseParametersAvailable(array('id','Titel','Beskrivelse', 'ISBN', 'Forfatter', 'Genre', 'Sprog'));
            $db = new DbOperation();
            $result = $db->opdaterBog(
                $_POST['id'],
                $_POST['Titel'],
                $_POST['Beskrivelse'],
                $_POST['ISBN'],
                $_POST['Forfatter'],
                $_POST['Genre'],
                $_POST['Sprog']
            );

            if($result){
                $response['error'] = false; 
                $response['message'] = 'Bogen er opdateret';
                $response['Bogen'] = $db->hentBog();
            }else{
                $response['error'] = true; 
                $response['message'] = 'Fejl';
            }
        break; 

             // Slet operationen:
            // Hvis API-kaldet er sletbog.
        case 'sletbog':

            // For Slet operationen skal vi anvende et GET parameter fra URL'en med det id, for det element som skal slettes.
            if(isset($_GET['id'])){
                $db = new DbOperation();
                if($db->sletBog($_GET['id'])){
                    $response['error'] = false; 
                    $response['message'] = 'Bogen er slettet';
                    $response['Bogen'] = $db->hentBog();
                }else{
                    $response['error'] = true; 
                    $response['message'] = 'Fejl';
                }
            }else{
                $response['error'] = true; 
                $response['message'] = 'Intet at slette, venligst angiv et nyt id';
            }
        break; 
    }

}else{
    // Hvis det ikke er et API-kald.
    // Sender en besked med svaret: "ikke et gyldigt API kald".
    $response['error'] = true; 
    $response['message'] = 'Ugyldigt API-kald';
}

// Viser svaret i JSON formatet.
echo json_encode($response);

我的DbOperation:

 <?php

    class DbOperation
{

    // Sti til databaseforbindelsen.
    private $con;

    // Konstruktør klassen.
    function __construct()
    {
        // Henter DbConnect.php filen.
        require_once dirname(__FILE__) . '/DbConnect.php';

        // Opretter et DbConnect objekt til at forbinde til databasen med.
        $db = new DbConnect();

        // Initialisere vores sti til databaseforbindelsen for denne klasse.
        // Ved at kalde metoden: "connect" fra DbConnect klassen.
        $this->con = $db->connect();
    }

     /*
     * Opret operationen:
     * Når denne metode bliver kaldt, så bliver der oprettet et nyt element i databasen.
     */
    function opretBog($Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog){
        $stmt = $this->con->prepare("INSERT INTO Bog (Titel, Beskrivelse, ISBN, Forfatter, Genre, Sprog) VALUES (?, ?, ?, ?, ?, ?)");
        $stmt->bind_param("ssssss", $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog);
        if($stmt->execute())
            return true; 
        return false; 
    }

    /*
     * Hent operationen:
     * Når denne metode bliver kaldt, bliver alle de eksisterende elementer i databasen hentet.
     */
    function hentBog(){
        $stmt = $this->con->prepare("SELECT id, Titel, Beskrivelse, ISBN, Forfatter, Genre, Sprog FROM Bog");
        $stmt->execute();
        $stmt->bind_result($id, $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog);

        $Boger = array(); 

        while($stmt->fetch()){
            $Bog = array();
            $Bog['id'] = $id; 
            $Bog['Titel'] = $Titel; 
            $Bog['Beskrivelse'] = $Beskrivelse; 
            $Bog['ISBN'] = $ISBN; 
            $Bog['Forfatter'] = $Forfatter; 
            $Bog['Genre'] = $Genre;
            $Bog['Sprog'] = $Sprog;  

            array_push($Boger, $Bog); 
        }

        return $Boger; 
    }

    /*
     * Opdater operationen:
     * Når denne metode bliver kaldt, bliver det element med det indtastede id, opdateret til nye værdier.
     */
    function opdaterBog($id, $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog){
        $stmt = $this->con->prepare("UPDATE Bog SET Titel = ?, Beskrivelse = ?, ISBN = ?, Forfatter = ?, Genre = ?, Sprog = ? WHERE id = ?");
        $stmt->bind_param("ssssssi", $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog, $id);
        if($stmt->execute())
            return true; 
        return false; 
    }


    /*
     * Slet operationen:
     * Når denne metode bliver kaldt, vil elementet med det indtastede id, blive slettet i databasen. 
     */
    function sletBog($id){
        $stmt = $this->con->prepare("DELETE FROM Bog WHERE id = ? ");
        $stmt->bind_param("i", $id);
        if($stmt->execute())
            return true; 

        return false; 
    }
}

希望你们可以帮助我,我是新手,我真的卡住了,我已经好几个小时了。

先谢谢,雅各布。

2 个答案:

答案 0 :(得分:0)

来自php api的响应没有给出发送您遇到此问题的确切所需数据。尝试将log.d放在您从api调用获得的响应上,然后进行调试。

答案 1 :(得分:0)

感谢您的帮助。我哥哥解决了这个问题。我在api中犯了一个小错误。我写道:“Bogen”而不是“bog”。

来自API:

        case 'hentbog':
        $db = new DbOperation();
        $response['error'] = false; 
        $response['message'] = 'Fuldført';
        $response['**Bogen**'] = $db->hentBog();

来自MainActivity:

@Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        progressBar.setVisibility(GONE);
        try {
            JSONObject object = new JSONObject(s);
            if (!object.getBoolean("error")) {
                Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
                opdaterBogList(object.getJSONArray("**bog**"));

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }