마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 org.json.jsonexception end of input at character 0 of android 오류 질문이요

0 추천
이 액티비티에서 edittext에 입력한 값을 버튼 사용해 검색하는 프로젝트입니다
package com.example.test;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

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

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MenuActivity extends AppCompatActivity {

    private static String TAG = "phpmenu";
   private static String IP_ADDRESS = "3.39.179.177";
   private static String TAG_JSON = "tb_restaurant";
   private static String TAG_NAME = "rest_name";
   private static String TAG_MENU = "main_menu";
   private static String TAG_ADD = "short_address";

   ArrayList<HashMap<String,String>>mArrayList;
   ListView lv;
   TextView tv;
   EditText et;
   String mJsonString;

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

       et = (EditText) findViewById(R.id.editText1);
       tv = (TextView) findViewById(R.id.textView5);
       lv = (ListView) findViewById(R.id.listview0);

       Button btn1 = (Button) findViewById(R.id.button1);
       btn1.setOnClickListener(new View.OnClickListener() {
            @Override
           public void onClick(View view) {

                mArrayList.clear();
               GetData task = new GetData();
               task.execute(et.getText().toString());
               et.setText("");
           }
        });
       mArrayList = new ArrayList<>();
   }

    class GetData extends AsyncTask<String, Void, String>{
        ProgressDialog progressDialog;
       String errorString = null;


       @Override
       protected void onPreExecute(){
            super.onPreExecute();

           progressDialog = ProgressDialog.show(MenuActivity.this, "please wait",null,true,true);
       }

        @Override
       protected void onPostExecute(String result){
            super.onPostExecute(result);

           progressDialog.dismiss();
           tv.setText(result);
           Log.d(TAG, "response-" + result);

           if(result == null){
                tv.setText(errorString);
           }
            else{
                mJsonString = result;
               showResult();
           }
        }
        @Override
       protected String doInBackground(String... params){
            String rest_name = params[0];
           String serverURL = "http://3.39.179.177/menu.php";
           String postParameters = "rest_name=" + rest_name;

           try{
                URL url = new URL(serverURL);
               HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

               httpURLConnection.setReadTimeout(5000);
               httpURLConnection.setConnectTimeout(5000);
               httpURLConnection.setRequestMethod("POST");
               httpURLConnection.setDoInput(true);
               httpURLConnection.connect();

               OutputStream outputStream = httpURLConnection.getOutputStream();
               outputStream.write(postParameters.getBytes("UTF-8"));
               outputStream.flush();
               outputStream.close();

               int responseStatusCode = httpURLConnection.getResponseCode();
               Log.d(TAG, "POST response code - " + responseStatusCode);

               InputStream inputStream;
               if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                    inputStream = httpURLConnection.getInputStream();
               }
                else{
                    inputStream = httpURLConnection.getErrorStream();
               }


                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
               BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

               StringBuilder sb = new StringBuilder();
               String line;

               while((line = bufferedReader.readLine()) != null){
                    sb.append(line);
               }


                bufferedReader.close();


               return sb.toString().trim();


           } catch (Exception e) {

                Log.d(TAG, "SearchData: Error ", e);

               errorString = e.toString();

             return null;
           }

        }
    }
    private void showResult(){
        try{
            JSONObject jsonObject = new JSONObject(mJsonString);
           JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);
           for(int i=0;i<jsonArray.length();i++) {
                JSONObject item = jsonArray.getJSONObject(i);

               String rest_name = item.getString(TAG_NAME);
               String main_menu = item.getString(TAG_MENU);
               String short_address = item.getString(TAG_ADD);

               HashMap<String,String> hashMap = new HashMap<>();
               hashMap.put(TAG_NAME,rest_name);
               hashMap.put(TAG_MENU,main_menu);
               hashMap.put(TAG_ADD,short_address);

           }
            ListAdapter adapter = new SimpleAdapter(MenuActivity.this,mArrayList,R.layout.item_list,
                   new String[]{TAG_NAME,TAG_MENU,TAG_ADD},
                   new int[]{R.id.textView2,R.id.textView3,R.id.textView4}
            );
           lv.setAdapter(adapter);
       }catch(JSONException e){
            Log.d(TAG,"showResult:",e);
       }
    }
}
php 파일입니다 얘는 검색 기능 잘 되더라고요

 

woojin (120 포인트) 님이 2023년 6월 18일 질문
showResult:
                                                                                                    org.json.JSONException: End of input at character 0 of
                                                                                                        at org.json.JSONTokener.syntaxError(JSONTokener.java:460)
                                                                                                        at org.json.JSONTokener.nextValue(JSONTokener.java:101)
                                                                                                        at org.json.JSONObject.<init>(JSONObject.java:168)
                                                                                                        at org.json.JSONObject.<init>(JSONObject.java:185)
                                                                                                        at com.example.test.MenuActivity.showResult(MenuActivity.java:164)
                                                                                                        at com.example.test.MenuActivity.access$100(MenuActivity.java:35)
                                                                                                        at com.example.test.MenuActivity$GetData.onPostExecute(MenuActivity.java:98)
                                                                                                        at com.example.test.MenuActivity$GetData.onPostExecute(MenuActivity.java:73)
                                                                                                        at android.os.AsyncTask.finish(AsyncTask.java:771)
                                                                                                        at android.os.AsyncTask.-$$Nest$mfinish(Unknown Source:0)
                                                                                                        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7872)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
에러 코드입니다.

1개의 답변

0 추천
먼저 AsyncTask 는 deprecated 된지 가 한참되었기 때문에 Retroit,, Volley, RxJava 등으로 교체하시는 것을 권장드립니다.

에러는 JSON 파씽에러로 보입니다. 서버에서 오는 데이터 구조와 파씽하려는 구조가 맞지 않아 생기는 것 같습니다. 이미지가 너무 작아서 내용을 볼 수가 없네요.

서버에서 오는 응답을 잘 체크해 보시고, 실수를 줄이기 위해서 JSON 파씽은 Gson같은 라이브러리를 사용하는게 더 낫습니다. JSON에 이해를 하고 난 다음에는 JSONObject를 이용해 수동으로 파씽을 하는 것 시간낭비로 보여집니다.
spark (227,830 포인트) 님이 2023년 6월 18일 답변
...