在Android Studio中解析Json数据 - 无法在日志中显示所有数据

时间:2016-07-31 08:25:29

标签: android json parsing android-studio

所以基本上我正在开发一个从mysql数据库中检索数据的应用程序。因此我创建了一个php脚本,它从数据库中检索数据并以JSON格式输出数据:

{
    "newslog": [
        {
            "Id": "1",
            "Title": "News Item 1",
            "Author": "Nich",
            "Body": "aldfjlak dklflksd afkjdflk ",
            "Date": "2016-07-26"
        },
        {
            "Id": "2",
            "Title": "News Item 2",
            "Author": "nich",
            "Body": "la la la la la la",
            "Date": "2016-07-26"
        },
        {
            "Id": "3",
            "Title": "News Item 3",
            "Author": "nich",
            "Body": "oh oh oh oh oh",
            "Date": "2016-07-26"
        }
    ]
}

我正在使用Android Studio,并设法在Android Studio日志中显示此数据(采用JSON格式),如下所示:

enter image description here

问题

我想在日志中显示来自此数据(JSON)的部分。但是目前我只能在日志中显示“标题”。当我尝试检索“Id”,“Body”或“Date”时,它们似乎被忽略了。我确信我错过了一些东西。

用于在日志中输出数据的代码:

Code used to output data in logs

日志:

enter image description here

Android Studio代码:

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListView;

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

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class NewsActivity extends AppCompatActivity {

    private ListView lv;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
        lv = (ListView) findViewById(R.id.listView);


//       List<String> newsItems = new ArrayList<String>();
//       newsItems.add("News 1");
//       newsItems.add("News 2");
//
//
//      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, newsItems);
//       lv.setAdapter(arrayAdapter);

        DownloadTask task = new DownloadTask();
        task.execute("http://council4u.com/php-scripts/getnews.php");
    }

    public class DownloadTask extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            URL url;
            HttpURLConnection urlConnection = null;

            try {
                url = new URL(urls[0]);

                urlConnection = (HttpURLConnection) url.openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();

                while (data != -1) {

                    char current = (char) data;

                    result += current;

                    data = reader.read();
                }

                return result;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }

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

            try{
                JSONObject data = new JSONObject(result);

                String latestnews = data.getString("newslog");
               Log.i ("Latest News", latestnews);


                JSONArray arr = new JSONArray(latestnews);

                for (int i = 0; i < arr.length(); i++) {

                    JSONObject jsonPart = arr.getJSONObject(i);


                    Log.i("title", jsonPart.getString("Title"));
                    Log.i("Body", jsonPart.getString("Body"));

                }

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


        }}
}

2 个答案:

答案 0 :(得分:1)

修改: 你正在使用:

 String latestnews = data.getString("newslog");

但在响应中它是一个数组,尝试替换这些行:

String latestnews = data.getString("newslog");
JSONArray arr = new JSONArray(latestnews);

通过:

JSONArray arr = data.getJSONArray("newslog");

当Log的消息为空时没有日志消息,尝试记录正文的长度并测试它是否为null:

  String body = jsonPart.getString("Body");
  Log.i("title", jsonPart.getString("Title"));
  Log.i("Body", body==null? "null body" : body.length());

答案 1 :(得分:1)

我遇到了类似的问题,尝试在{Serializable(或Parcelable)时JSONIntent偶数和Extras对象进行记录1}}在onCreate()内。

始终使用Activity工具显示null ...好吧,我尝试使用Evaluate Expression并且我已经看到数据是正确的。使用Toast会产生同样的效果。

最后,我假设数据是正确的,Android Studio调试器上存在问题。