从JSON对象循环并创建一个数组

时间:2013-07-10 10:24:29

标签: android json eclipse string object

您好我正在开发一个从API解析一些JSON的应用程序。我得到了这个工作,它显示了所有的信息。我现在面临的问题是我似乎无法从"FileID"获得JSON String

输出如下:

{ error: "", <fileId>: { infoToken: <string>, deleteToken: <string>, size: <int>, sha1: <string>, filename: <string> } }

为每个文件随机生成"fileID"。我怎样才能抓住并解析那个?我得到所有其他信息就好了,只需要获得"fileId"

所以,当这样做时,我想收集所有信息并将其放入ListView,我需要遍历收到的所有项目。

public class FilesActivity extends SherlockActivity {

    private static String TAG_FILENAME = "filename";
    private static String TAG_SIZE = "size";
    private static String TAG_ITOKEN = "infoToken";
    private static String TAG_DTOKEN = "deleteToken";
    private static String TAG_SHA1 = "sha1";


    @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("http://api.bayfiles.net/v1/account/files?session=<sessionId>");

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

               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 request = new JSONObject(response);
               for (Iterator<?> keyIterator = request.keys(); keyIterator.hasNext(); ) {
                   String key = (String) keyIterator.next();
                   JSONObject object = request.optJSONObject(key);

                   if (object != null) {
                       //Setting TAGs
                       TAG_FILENAME = object.getString("filename");
                       TAG_SIZE = object.getString("size");
                       TAG_ITOKEN = object.getString("infoToken");
                       TAG_DTOKEN = object.getString("deleteToken");
                       TAG_SHA1 = object.getString("sha1");            


                       txt.setText(
                               TAG_FILENAME + "\n"
                               + TAG_SIZE + "\n"
                               + TAG_ITOKEN + "\n"
                               + TAG_DTOKEN + "\n"
                               + TAG_SHA1 + "\n"
                               + txt.getText()
                               );                      

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

        }
    }
}

非常感谢任何帮助!

编辑:试过这个,不知道它是否会起作用:

ArrayList<fileObject> objectList = new ArrayList<fileObject>();
                   if (object != null) {

                       fileObject obj = new fileObject();

                       obj.setFileName(object.getString("filename"));
                       obj.setSize(object.getString("size"));
                       obj.setInfoToken(object.getString("infoToken"));
                       obj.setDeleteToken(object.getString("deleteToken"));
                       obj.setSha1(object.getString("sha1"));

                       objectList.add(obj);        

                       Log.d("log_tag", object.getString("filename"));
                   }
                   adapter = mView.new fileObjectAdapter(mContext);
                   setListAdapter(adapter);
                   adapter.addAll(objectList); //if honeycomb or higher
                   for (fileObject obj : objectList) {
                       adapter.add(obj);
                       }

和我的适配器:

package com.dev.jsontest.adapter;


import com.dev.jsontest.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class fileObjectAdapter extends ArrayAdapter<fileObject> {

    public fileObjectAdapter(Context context) {
        super(context, 0);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.dbitems, parent, false);
        }

        final fileObject item = getItem(position);

        //define your view that you want each list item to look like. Make sure to set every field in your view.

        return convertView;
    }
}

的FileObject:

package com.dev.jsontest.adapter;

public class fileObject {

    private String fileName;
    private String size;
    private String infoToken;
    private String deleteToken;
    private String sha1;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getInfoToken() {
        return infoToken;
    }

    public void setInfoToken(String infoToken) {
        this.infoToken = infoToken;
    }

    public String getDeleteToken() {
        return deleteToken;
    }

    public void setDeleteToken(String deleteToken) {
        this.deleteToken = deleteToken;
    }

    public String getSha1() {
        return sha1;
    }

    public void setSha1(String sha1) {
        this.sha1 = sha1;
    }
}

3 个答案:

答案 0 :(得分:1)

这不会详细回答您的问题,但一般来说让框架执行所有解析工作可能会有所帮助:)

也许杰克逊适合你? (http://wiki.fasterxml.com/JacksonInFiveMinutes

答案 1 :(得分:0)

为什么不将fileid重命名为file并使fileid成为该数组中的字段? (如fileid: <fileid>

或者你不能改变传入的JSON-String?

答案 2 :(得分:0)

我认为您需要“访问”json的所有键(从第一级开始)。  尝试这样的事情:

String jsonString = "{ \"error\": \"\", \"<fileId>\": { \"infoToken\": \"<string>\", \"deleteToken\": \"<string>\", \"size\": \"<int>\", \"sha1\": \"<string>\", \"filename\": \"<string>\" } }";
    try {
        JSONObject json = new JSONObject(jsonString);
        Iterator<String> it = json.keys();
        while(it.hasNext()){
            String key = it.next();

            if(!"error".equals(key)){
                String fileId = key;
                JSONObject fileIdJsonObj = json.getJSONObject(fileId);
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }