2016-08-19 5 views
3

Я создаю приложение, которое может получить слово, поместив идентификационный номер в editText. Я продолжаю получать эту ошибку. Как решить эту проблему? org.json.JSONException: Нет значение { "server_response": "Bird"}Как решить ошибку в org.json.JSONException?

enter image description here

Вот мой Главная Activity.java

package com.example.keam.lastnato; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

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.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 

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

public class MainActivity extends Activity { 

String id; 
String word; 
InputStream is=null; 
String result=null; 
String line=null; 
String data =""; 
TextView disp; 
String url = "http://192.168.0.10/checkpls.php"; 

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

    final EditText e_id=(EditText) findViewById(R.id.editText1); 
    Button select=(Button) findViewById(R.id.button1); 
    disp = (TextView)findViewById(R.id.textView); 
    select.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      id = e_id.getText().toString(); 
      select(); 
     } 
    }); 
} 

public void select() 
{ 
    class readThis extends AsyncTask<String, Void, String> { 
     protected String doInBackground(String... params){ 

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

      nameValuePairs.add(new BasicNameValuePair("id",id)); 

      try 
      { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(params[0]); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
       Log.e("pass 1", "connection success "); 
      } 
      catch(Exception e) 
      { 
       Log.e("Fail 1", e.toString()); 
      Toast.makeText(getApplicationContext(), "Invalid IP Address", 
         Toast.LENGTH_LONG).show(); 
      } 

      try 
      { 
       BufferedReader reader = new BufferedReader 
         (new InputStreamReader(is,"iso-8859-1"),8); 

       StringBuilder sb = new StringBuilder(); 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line); 
       } 
       is.close(); 
       result = sb.toString(); 
       Log.e("pass 2", "connection success "); 
      } 
      catch(Exception e) 
      { 
       Log.e("Fail 2", e.toString()); 
      } 

      try 
      { 

       JSONObject json_data = new JSONObject(result); 
       word = json_data.getString(result); 
       Toast.makeText(getBaseContext(), "Name: " + word, 
       Toast.LENGTH_SHORT).show(); 

      } 

      catch(JSONException e) 
      { 
       Log.e("Fail 3", e.toString()); 
       Log.e("log_tag", "Failed data was: " + result); 
      } 
      return word; 
     } 
    } 

    readThis hello = new readThis(); 
    hello.execute(new String[] {url}); 
} 
} 

Вот мой activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.keam.lastnato.MainActivity"> 

<EditText 
    android:id="@+id/editText1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="39dp" 
    android:padding="11dp" 
    android:hint="Id" 
    android:ems="10" 
    android:inputType="number"> 

    <requestFocus /> 
</EditText> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/editText1" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="24dp" 
    android:onClick="parseJSON" 
    android:padding="11dp" 
    android:text="Select" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textView" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

Вот мой файл PHP «checkpls.php»

<?php 
$con = mysqli_connect("localhost", "root", "1234", "check") or die ("Error ".mysqli_error($con)); 
$id = $_POST['id']; 
$sql = "SELECT * FROM tblcheckword where id like '$id';"; 
$result = mysqli_query($con, $sql) or die("Error in selecting ".mysqli_error($con)); 

$response = array(); 
if(mysqli_num_rows($result) > 0){ 
    while($row = mysqli_fetch_array($result)) 
    { 
     array_push($response, array("id"=>$row[0],"word"=>$row[1],"meaning"=>$row[2])); 
     $retrieve = $row[1]; 
    } 
    echo json_encode(array("server_response" => $retrieve)); 
}else{ 
    echo "Retrieve failed"; 
} 

mysqli_close($con); 


?> 

Вот мой tblcheckword в WAMP PHPMyAdmin

Database Name = "проверить"

enter image description here

Вот моя ошибка LogCat.

08-19 14:10:48.367 23305-23536/com.example.keam.lastnato E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                     Process: com.example.keam.lastnato, PID: 23305 
                     java.lang.RuntimeException: An error occured while executing doInBackground() 
                      at android.os.AsyncTask$3.done(AsyncTask.java:300) 
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:841) 
                     Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
                      at android.os.Handler.<init>(Handler.java:200) 
                      at android.os.Handler.<init>(Handler.java:114) 
                      at android.widget.Toast$TN.<init>(Toast.java:372) 
                      at android.widget.Toast.<init>(Toast.java:105) 
                      at android.widget.Toast.makeText(Toast.java:264) 
                      at com.example.keam.lastnato.MainActivity$1readThis.doInBackground(MainActivity.java:120) 
                      at com.example.keam.lastnato.MainActivity$1readThis.doInBackground(MainActivity.java:61) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                      at java.lang.Thread.run(Thread.java:841)  
    08-19 14:10:49.969 23305-23536/com.example.keam.lastnato I/Process: Sending signal. PID: 23305 SIG: 9 
+1

предоставить Вам JSon данные – SaravInfern

+0

пожалуйста, убедитесь, что "результат" строка должна быть { "server_response": "Bird"}. И вы можете получить слово = json_data.getString ("server_response"); – sasha

ответ

8

Изменение word = json_data.getString(result); в word = json_data.getString("server_response");

Update:

public void select(){ 
    readThis hello = new readThis(); 
    hello.execute(new String[] {url}); 
} 

private class ReadThis extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

      nameValuePairs.add(new BasicNameValuePair("id",id)); 

      try 
      { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(params[0]); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
       Log.e("pass 1", "connection success "); 
      } 
      catch(Exception e) 
      { 
       Log.e("Fail 1", e.toString()); 
      Toast.makeText(getApplicationContext(), "Invalid IP Address", 
         Toast.LENGTH_LONG).show(); 
      } 

      try 
      { 
       BufferedReader reader = new BufferedReader 
         (new InputStreamReader(is,"iso-8859-1"),8); 

       StringBuilder sb = new StringBuilder(); 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line); 
       } 
       is.close(); 
       result = sb.toString(); 
       Log.e("pass 2", "connection success "); 
      } 
      catch(Exception e) 
      { 
       Log.e("Fail 2", e.toString()); 
      } 
      } 
      return result ; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      try 
     { 

      JSONObject json_data = new JSONObject(result); 
      word = json_data.getString("server_response"); 
      Toast.makeText(getBaseContext(), "Name: " + word, 
      Toast.LENGTH_SHORT).show(); 

     } 

     catch(JSONException e) 
     { 
      Log.e("Fail 3", e.toString()); 
      Log.e("log_tag", "Failed data was: " + result); 
     } 
     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 
+0

Я изменил его, но у меня есть ошибка в Toast и E/AndroidRuntime: FATAL EXCEPTION: AsyncTask # 1. Пожалуйста помоги. – NeophyteCoder

+0

Можете ли вы опубликовать logcat и полный ответ json? – SaravInfern

+0

E/AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: AsyncTask # 1 процесса: com.example.keam.lastnato, PID: 23305 java.lang.RuntimeException: Произошла ошибка при выполнении doInBackground() – NeophyteCoder

0

JSON является значение ключа пара {"key","value"} например;

то, что вы пытаетесь сделать, это получить значение, используя объект JSON.

изменение линии word = json_data.getString(result); с word = json_data.getString("YOUR_KEY");

+0

Спасибо за ответ :) – NeophyteCoder

Смежные вопросы