【问题标题】:Loop and create a Array from JSON Objects循环并从 JSON 对象创建一个数组
【发布时间】:2013-07-10 10:24:29
【问题描述】:

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

输出是这样的:

{ 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;
    }
}

文件对象:

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;
    }
}

【问题讨论】:

    标签: android json eclipse string object


    【解决方案1】:

    这并没有详细回答您的问题,但总的来说,让框架完成所有解析工作可能会有所帮助:)

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

    【讨论】:

      【解决方案2】:

      为什么不将fileid 重命名为file 并使fileid 成为该数组中的一个字段? (如fileid: &lt;fileid&gt;

      或者您不能更改传入的 JSON 字符串吗?

      【讨论】:

      • 嗨,我无法更改传入的 JSON,这是我问过他们的 API,但他们不会...
      【解决方案3】:

      我认为您需要“访问”您的 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();
          }
      

      【讨论】:

        猜你喜欢
        • 2017-08-09
        • 1970-01-01
        • 2021-12-24
        • 2016-11-11
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多