2013-07-10 80 views
0

我试图从JSON API中获取所有值,我设法获得了几乎所有的值,除了一个!正如你所看到的,这是服务器的JSON输出。 (我不能改变它)无法从JSON获取上一个值

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

正如你可以看到,每一个串/“阵列”带“FILEID”这是随机地从服务器生成开始。我使用下面的代码,我可以看到所有的值,如:文件名,大小,sh1等。但我似乎无法弄清楚如何获得“fileId”。该FILEID是(在此JSON)S8tf和S29N

我的代码:

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

    private ListView lv; 

    @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=of1903u3pj43c3can8rc33gc42"); 

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

        ArrayList<fileObject> objectList = new ArrayList<fileObject>(); 
        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()); 

     } 
    } 
} 

如果你没有得到它,我想抓住从FILEID又名S8tf和S29N的价值,这些都是随机数并由服务器生成。

编辑:得到它的工作感谢你们!因为我知道海报搞不清楚,所以我做的是把String fileId = key;在我的对象循环,就像这样:

if (object != null) { 
    fileObject obj = new fileObject(); 
    obj.setFileId(key); 
    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("fileId", key); // Shows both of the values! 
} 
+2

您的fileId位于'key'变量中。 – njzk2

回答

0

如果你看看你的for循环的第一部分...

JSONObject request = new JSONObject(response); 

for (Iterator<?> keyIterator = request.keys(); keyIterator.hasNext();) { 

     String key = (String) keyIterator.next(); 
     JSONObject object = request.optJSONObject(key); 

你要求所有的键从代表来自服务器的响应的JSONObject。这些键是您正在查找的值。如果你在你的循环的第一行后添加

System.out.println(key);

,你会看到打印出来的值(“错误”,“S8tf”,...)。

+0

System.out.orintln(key);只显示错误,没有更多 –

+0

对不起,我现在得到了两个名称,像S8tf和S29N –

+0

哦,对不起,忘了我们在Android ..调试并检查键值或使用Log.v()看什么价值是。是的,因为你在一个for循环中,你应该得到多个日志语句。这能解决你的问题吗? – Joel