Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

General Discussion

Creating a page that generates JSON data

Hi,

I just completed the Blog Reader section of the Android Development track. It was really helpful, and learned lots from it.

I was wondering if there were some tutorials on how I generate the JSON data on, for instance, another site as oppose to the blogFeedUrl provided http://blog.teamtreehouse.com/api/get_recent_summary/?count=

I also notice in the URL the following: "?count=" I am using php was used to produce this page. So how would set up a webpage in a way where it would populate a list of item based on the count amount.

Thanks in advance.

2 Answers

I have produce a php page with the following code: <?php $post = array('id' => '1', 'url' => 'test.com', 'title' => 'test', 'date' => '7/6/2014', 'author' => 'bobby', 'thumbnail' => '#', );

echo json_encode($post); ?>

From my understanding, this should produce the JSON data required. However, I am unable to connect with the website in the application. To code for the application (based on blog reader) is has such:

package com.dooba.blogreader;

import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap;

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

import android.app.AlertDialog; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast;

public class MainListActivity extends ListActivity {

public static final int NUMBER_OF_POSTS = 20;
public static final String TAG = MainListActivity.class.getSimpleName();
protected JSONObject mBlogData;
protected ProgressBar mProgressBar;

private final String KEY_TITLE = "title";
private final String KEY_AUTHOR = "author";

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

    mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);

   if (isNetworkAvailable()) {
       mProgressBar.setVisibility(View.VISIBLE);
    GetBlogPostsTask getBlogPostsTask = new GetBlogPostsTask();
    getBlogPostsTask.execute();
   }
   else {
       Toast.makeText(this, "Network is unavailable", Toast.LENGTH_LONG);
   }
   // Toast.makeText(this, getString(R.string.no_items), Toast.LENGTH_LONG);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    try {
        JSONArray jsonPosts = mBlogData.getJSONArray("posts");
        JSONObject jsonPost = jsonPosts.getJSONObject(position);
        String blogUrl = jsonPost.getString("url");
        Intent intent = new Intent(this, BlogWebViewActivity.class);
        intent.setData(Uri.parse(blogUrl));
        startActivity(intent);
    } catch (JSONException e) {
        logException(e);
    }

; }

private void logException(Exception e) {
    Log.e(TAG, "Exception caught!", e);
}



private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();

    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()) {
        isAvailable = true;
    }
    return isAvailable;
}



public void handleLogResponse() {
    mProgressBar.setVisibility(View.INVISIBLE);

    if (mBlogData == null) {
        updateDisplayForError();

    }
    else {
        try {
            JSONArray jsonPosts = mBlogData.getJSONArray("posts");
            ArrayList<HashMap<String, String>> blogPosts = 
                    new ArrayList<HashMap<String,String>>();
            for (int i = 0; i < jsonPosts.length(); i++) {
                JSONObject post = jsonPosts.getJSONObject(i);
                String title = post.getString(KEY_TITLE);
                title = Html.fromHtml(title).toString();
                String author = post.getString(KEY_AUTHOR);
                author = Html.fromHtml(author).toString();

                HashMap<String, String> blogPost = new HashMap<String, String>();
                blogPost.put(KEY_TITLE, title);
                blogPost.put(KEY_AUTHOR, author);

                blogPosts.add(blogPost);


            }
            String[] keys = { KEY_TITLE, KEY_AUTHOR };
            int[] ids = { android.R.id.text1, android.R.id.text2 };
            SimpleAdapter adapter = new SimpleAdapter(this, blogPosts, 
                    android.R.layout.simple_list_item_2, 
                    keys, ids);
            setListAdapter(adapter);

        } catch (JSONException e) {
            logException(e);
        }
    }
}


private void updateDisplayForError() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.error_title));
    builder.setMessage(getString(R.string.error_message));
    builder.setPositiveButton(android.R.string.ok, null);
    AlertDialog dialog = builder.create();
    dialog.show();

    TextView emptyTextView = (TextView) getListView().getEmptyView();
    emptyTextView.setText(getString(R.string.no_items));
}

private class GetBlogPostsTask extends AsyncTask<Object, Void, JSONObject> {

    @Override
    protected JSONObject doInBackground(Object... params) {
         int responseCode = -1;
         JSONObject jsonResponse = null;
         try {
                URL blogFeedUrl = new URL("http://dooba.ca/analytics/ed.php");
                HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
                connection.connect();

                responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    InputStream inputStream = connection.getInputStream();
                    Reader reader = new InputStreamReader(inputStream);
                    int contentLength = connection.getContentLength();
                    char[] charArray = new char[contentLength];
                    reader.read(charArray);
                    String responseData = new String(charArray);

                    jsonResponse = new JSONObject(responseData);

                }
                else {  
                Log.i(TAG, "Unsuccesful HTTP Response Code: " + responseCode);
                }
            }
            catch (MalformedURLException e) {
                logException(e);
            }

            catch (IOException e) {
                logException(e);
            }
            catch (Exception e){
                logException(e);
            }
            return jsonResponse;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        mBlogData = result;
        handleLogResponse();
}

}

}

Thanks in advance for all of your help; much appreciate.

Exactly, am in the same shoes as you are!! we need to know how to create that page the feeds JSON! I already made another post! if you search for api in the forums you will find it!

If you find a way to do it, please let me know :) thanks!