1

in working on an app for a site. I've been trying to solve this problem for a week or so, asking around googleing a LOT! And i cant seem to find a solution. I have a JSON String which is:

{
   "error":"",
   "S8tf":{
      "infoToken":"wCfhXe",
      "deleteToken":"gzHTfGcF",
      "size":122484,
      "sha1":"8c4e2bbc0794d2bd4f901a36627e555c068a94e6",
      "filename":"Screen_Shot_2013-07-02_at_3.52.23_PM.png"
   },
   "S29N":{
      "infoToken":"joRm6p",
      "deleteToken":"IL5STLhq",
      "size":129332,
      "sha1":"b4a03897121d0320b82059c36f7a10a8ef4c113d",
      "filename":"Stockholmsyndromet.docx"
   }
}

I want it do be something like a JSON Array so i dont have to search for "S8tf" and "S29N" Since this is randomly generated by server. If you know what i mean? (bad at explaining).

I cant seem to get all the information from "error" and show it. I've tried anything, and still i cant seem to figure it out.

Activity: (Tutorial, should work)

package com.androidhive.jsonparsing;

import java.util.ArrayList;
import java.util.HashMap;

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

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AndroidJSONParsingActivity extends ListActivity {

    // url to make request
    private static String url = "http://api.bayfiles.net/v1/account/files?session=7je10rvdhr1mcvjam75hetaul0";

    // JSON Node names
    private static final String TAG_CONTACTS = "error";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_EMAIL = "email";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_GENDER = "gender";
    private static final String TAG_PHONE = "phone";
    private static final String TAG_PHONE_MOBILE = "mobile";
    private static final String TAG_PHONE_HOME = "home";
    private static final String TAG_PHONE_OFFICE = "office";

    // contacts JSONArray
    JSONArray contacts = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Hashmap for ListView
        ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        JSONObject json = jParser.getJSONFromUrl(url);

        try {
            // Getting Array of Contacts
            contacts = json.getJSONArray(TAG_CONTACTS);

            // looping through All Contacts
            for(int i = 0; i < contacts.length(); i++){
                JSONObject c = contacts.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String name = c.getString(TAG_NAME);
                String email = c.getString(TAG_EMAIL);
                String address = c.getString(TAG_ADDRESS);
                String gender = c.getString(TAG_GENDER);

                // Phone number is agin JSON Object
                JSONObject phone = c.getJSONObject(TAG_PHONE);
                String mobile = phone.getString(TAG_PHONE_MOBILE);
                String home = phone.getString(TAG_PHONE_HOME);
                String office = phone.getString(TAG_PHONE_OFFICE);

                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_NAME, name);
                map.put(TAG_EMAIL, email);
                map.put(TAG_PHONE_MOBILE, mobile);

                // adding HashList to ArrayList
                contactList.add(map);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }


        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(this, contactList,
                R.layout.list_item,
                new String[] { TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE }, new int[] {
                        R.id.name, R.id.email, R.id.mobile });

        setListAdapter(adapter);

        // selecting single ListView item
        ListView lv = getListView();

        // Launching new screen on Selecting Single ListItem
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
                String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

                // Starting new intent
                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                in.putExtra(TAG_NAME, name);
                in.putExtra(TAG_EMAIL, cost);
                in.putExtra(TAG_PHONE_MOBILE, description);
                startActivity(in);

            }
        });



    }

}

EDIT: I know how irritating it is to see that the OP got it working, but without any kind of code what so ever. So i'll post the code which worked for me :)

public class FilesActivity extends SherlockListActivity {

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

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Files");

        String response = null;
        DefaultHttpClient httpClient = new DefaultHttpClient();
        ResponseHandler <String> resonseHandler = new BasicResponseHandler();
        HttpPost postMethod = new HttpPost("URL");

        try
        {
        JSONObject json = new JSONObject();
               json.put("filename", "error");
               //json.put("Fiedl2", "");

               postMethod.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF8")));
               postMethod.setHeader( "Content-Type", "application/json" );
               response = httpClient.execute(postMethod,resonseHandler);
               TextView txt = (TextView)findViewById(R.id.nodata);

               //JSONObject mJsonObject = new JSONObject(response);
               //JSONObject userJObject = mJsonObject.getJSONObject("error");
               JSONObject request = new JSONObject(response);
               for (Iterator keyIterator = request.keys(); keyIterator.hasNext(); ) {
                   // will be set to "S29N", "S8tf", "error" etc
                   String key = (String) keyIterator.next();
                   // will get value if it's an JSONObject or null if it's not
                   JSONObject object = request.optJSONObject(key);

                   if (object != null) {
                       //doSomething(object); // ← process the object
                       txt.setText(object.toString());
                       Log.d("log_tag", object.toString());
                   }
               }

        }
        catch(Exception e)
        {      
            e.printStackTrace();
            Log.d("log_tag", "Error: " + e.toString());

        }
    }

Thank you very much guys!

Stian Instebo
  • 653
  • 1
  • 12
  • 31

4 Answers4

2

Let's reformat that for a start.

{
  "S29N": {
    "deleteToken": "IL5STLhq",
    "filename": "Stockholmsyndromet.docx",
    "infoToken": "joRm6p",
    "sha1": "b4a03897121d0320b82059c36f7a10a8ef4c113d",
    "size": 129332
  },
  "S8tf": {
    "deleteToken": "gzHTfGcF",
    "filename": "Screen_Shot_2013-07-02_at_3.52.23_PM.png",
    "infoToken": "wCfhXe",
    "sha1": "8c4e2bbc0794d2bd4f901a36627e555c068a94e6",
    "size": 122484
  },
  "error": ""
}

So what you seem to be trying to achieve is to iterate over the objects like S29N, S8tf and any other provided they are really objects. This is doable with something like this (code is not tested):

// let's say sourceString is the variable holding the JSON text
JSONObject request = new JSONObject(sourceString);
for (Iterator keyIterator = request.keys(); keyIterator.hasNext(); ) {
    // will be set to "S29N", "S8tf", "error" etc
    String key = (String) keyIterator.next();
    // will get value if it's an JSONObject or null if it's not
    JSONObject object = request.optJSONObject(key);

    if (object != null) {
        doSomething(object); // ← process the object
    }
}

Sorry if it doesn't help — I've answered before you've posted updated question, now I'm really stunned by the java source since I can't figure out the relation of the data you recieving to the data you're displaying (the former seems to be some file manipulation requests, the latter — some personal contact data).

user1410657
  • 1,284
  • 9
  • 5
  • Thank you very much, one more question! How is it possible to show all the received content into one listview or textview? – Stian Instebo Jul 09 '13 at 21:18
  • Well, this depends on how pretty you want result to be. The simpliest, ugliest and “hack-grade” solution (just to see what's you receiving) would be: instead of using `txt.setText(object.toString());` append text using e.g. `txt.setText(txt.getText() + "\n\n" + object.toString());` – user1410657 Jul 09 '13 at 22:32
  • I am trying to retrieve data from a JSON file and show it in a home widget. Any idea how I can accomplish that? My app retrieves the file data but does not update the widget. – Si8 Dec 09 '13 at 22:28
2

The reason you aren't getting any value for "error", is because there isn't one :)

See "error":""

Also, looks like you're trying to get a JSON array, but there isn't a single array in the JSON object to get. To get your code to work, you would need the JSON object to look like this:

{
   "error":[],
   "S8tf":[{
      "infoToken":"wCfhXe",
      "deleteToken":"gzHTfGcF",
      "size":122484,
      "sha1":"8c4e2bbc0794d2bd4f901a36627e555c068a94e6",
      "filename":"Screen_Shot_2013-07-02_at_3.52.23_PM.png"
   }],
   "S29N":[{
      "infoToken":"joRm6p",
      "deleteToken":"IL5STLhq",
      "size":129332,
      "sha1":"b4a03897121d0320b82059c36f7a10a8ef4c113d",
      "filename":"Stockholmsyndromet.docx"
   }]
}

Since some of the base node names are unknown (generated by the server, as you said), you can iterate over the JSON object like this to get at them:

    Iterator<?> keys = json.keys();

    while(keys.hasNext()){
        String key = (String)keys.next();
        if (json.get(key) instanceof JSONObject ){
            // do something with the node referenced by the key
        }
    }
ErikR
  • 1,052
  • 6
  • 12
  • So something like this? : //Receive the JSON `String sourceString = ""; try { JSONObject request = new JSONObject(sourceString); for (Iterator keyIterator = request.keys(); keyIterator.hasNext(); ) { // will be set to "S29N", "S8tf", "error" etc String key = (String) keyIterator.next(); // will get value if it's an JSONObject or null if it's not JSONObject object = request.optJSONObject(key); if (object != null) { //doSomething(object); // ← process the object } } }catch (Exception e){ }` – Stian Instebo Jul 09 '13 at 17:50
0

you have to use JsonReader: http://developer.android.com/reference/android/util/JsonReader.html

If the format of the output is what you described here, you can do some assumptions about the JSON objects that you are retrieving. For example if an object name is different from "error" and start with 'S', you can assume that is the object that you want.

In your case, you need to parse the code like this:

reader.beginObject();
while(reader.hasNext()){
    String name = reader.nextName();
    if(name.startsWith("S")){
        reader.beginObject()
        //do your stuff
        reader.endObject();
    }
    else
        reader.skipValue()
}
reader.endObject();
JoP
  • 555
  • 8
  • 18
0

In your case, there are three json objects inside the array.

Why dont you store the values of the array in a hashmap(or any key value type).

Now each of your hashmap will contain a key and a value. the value is your json, which

you can parse it again.

Have a look at this similar question.

Community
  • 1
  • 1
amalBit
  • 12,041
  • 6
  • 77
  • 94
  • Actually that's not an array, that's an object: array would start with an '[' and wouldn't have keys in it. – user1410657 Jul 09 '13 at 17:26
  • Yes you are right. But arrays can have objects. Never mind. My apologies. You can still consider it as objects inside object and still follow my answer.. – amalBit Jul 09 '13 at 17:28
  • Yes, the actual difficulty, I believe, is to iterate over the values inside the JSON object, which I've adressed in my earler answer. – user1410657 Jul 09 '13 at 17:31