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

안드로이드 json paser 에러 질문이 있습니다

0 추천
public class tools_main2 extends AppCompatActivity {

    private GridView mGridView;

    private tools_adapter2 mGridAdapter;
    private ArrayList<tools_item2> mGridData;

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

        mGridView = (GridView) findViewById(R.id.gridView_base);

        //Initialize with empty data
        mGridData = new ArrayList<>();
        mGridAdapter = new tools_adapter2(this, R.layout.tools_grid_view, mGridData);
        mGridView.setAdapter(mGridAdapter);
        //Start download
        new AsyncHttpTask().execute("");
    }

    //Downloading data asynchronously
    public class AsyncHttpTask extends AsyncTask<String, Void, String> {
        HttpURLConnection urlConnection;
        StringBuilder result;

        @Override
        protected String doInBackground(String... params) {
            result = new StringBuilder();
            urlConnection = null;

            try {
                URL url = new URL("https://script.google.com/macros/s/AKfycbxW2X5zPvG1ED7opyJ7_1zbHOvHQdVGn2rUmfDdabTA8rEkGf5o/exec");
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.connect();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
                String result = "";
                while ((line = reader.readLine()) != null) {
                    result += line;
                }
                parseResult(line);
                // Close stream
                if (null != in) {
                    in.close();
                }
                return result;

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                assert urlConnection != null;
                urlConnection.disconnect();
            }
            return result.toString();
        }


        @Override
        protected void onPostExecute(String result) {
            // Download complete. Lets update UI

            mGridAdapter.setGridData(mGridData);
        }


        String streamToString(InputStream stream) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
            String line;
            String result = "";
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }

            // Close stream
            if (null != stream) {
                stream.close();
            }
            return result;
        }

        /**
         * Parsing the feed results and get the list
         *
         * @param result
         */
        private void parseResult(String result) {

            try {
                JSONObject response = new JSONObject(result);
                JSONArray posts = response.optJSONArray("posts");
                tools_item2 item;
                for (int i = 0; i < posts.length(); i++)
                {
                    String title = posts.optJSONObject(i).getString("title");
                    String image = posts.optJSONObject(i).getString("image");
                    item = new tools_item2();
                    item.setTitle(title);
                    item.setImage(image);
                    mGridData.add(item);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
          }
       }
    }

안녕하세요 json을 받아서 텍스트와 image를 뿌리는 소스를 구현중입니다.. 피카소를 이용 하구 있구요

null에러가 떠서 이렇게 질문합니다 ㅠㅠ

위에 소스는 main소스구요

에러 로그캣입니다

04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:94)
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.androidtown.ezcoffee.tools.tools_main2$AsyncHttpTask.parseResult(tools_main2.java:118)
04-27 02:50:19.700 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.androidtown.ezcoffee.tools.tools_main2$AsyncHttpTask.doInBackground(tools_main2.java:70)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at org.androidtown.ezcoffee.tools.tools_main2$AsyncHttpTask.doInBackground(tools_main2.java:50)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-27 02:50:19.701 12218-12762/org.androidtown.ezcoffee W/System.err:     at java.lang.Thread.run(Thread.java:818) 

읽어주셔서 감사합니다. json은 구글 스프레드시트를 통해서 가져옵니다. 확인 해봤구요 ㅠㅠ 제발 어떻게 해야 하는지 알려주시면 감사하겠습니다. 

Hee 님이 2016년 4월 27일 질문

2개의 답변

0 추천
posts라는 jsonArray 가 없어서 더이상 파싱이 진행되지 않는거같은데요.

json데이터를 올려주세요.

제가보기엔 아마 파싱을 잘못 하신거같습니다.

json을 일단 먼저 공부하시고

jsonObject인지 array인지 알아야 파싱할때 array로 파싱할지 object로 파싱할지 결정을 할수있습니다.

이런 작업이 귀찮으면 구글의 gson 라이브러리를 사용하시면 편하긴합니다.

참고로

{} - object

[] - array

입니다.
캬옹이 (37,920 포인트) 님이 2016년 4월 27일 답변
0 추천
doInBackground 함수에서 parseResult 에 인자로 line 이 아닌 result 를 넘겨주어야 하는 것 아닌가요?
익명사용자 님이 2016년 4월 27일 답변
그것도 수정해보고 해보겠습니다 감사합니다 그렇네요 라인을 넘겨주는게 아니네요 감사합니다 ^ㅡ^
...