2013-05-03 96 views
0

我在SD卡上有一個JSON對象數組。在Android應用程序中解析SD卡中的json文件

我得到的文件內容是這樣的:

File yourFile = new File("/mnt/extSdCard/test.json"); 
     FileInputStream stream = new FileInputStream(yourFile); 
     String jString = null; 
     try { 
      FileChannel fc = stream.getChannel(); 
      MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
      /* Instead of using default, pass in a decoder. */ 
      jString = Charset.defaultCharset().decode(bb).toString(); 
      } 
      finally { 
      stream.close(); 
      } 

的結構是這樣的:

[{"name":"john"},{"name":"fred"},{"name":"sam"}] 

,我希望能夠分析他們做出一個ListView。在JavaScript中,我可以將它們作爲AJAX請求,然後執行

var people = JSON.parse(data.responseText); 

然後遍歷數組。但是我在java中是一個完全新手 - 我已經找到了分別完成這些事情的示例代碼,但是我不能將它們放在一起。任何幫助非常感謝。

+0

這將是更適當的解釋你到目前爲止嘗試過什麼。 – rciovati 2013-05-03 16:11:46

回答

0

試試這個

String[] from = new String[] {"name"}; 
int[] to = new int[] { R.id.name}; 
List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); 

try 
{ 
    JSONArray names = new JSONArray(jsonString); 
    Log.i("MyList","Number of names " + names.length()); 
    for (int j = 0; j < names.length(); j++) 
    { 
     JSONObject jsonObject = names.getJSONObject(j); 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("name", jsonObject.getString("name")); 
     fillMaps.add(map); 
    } 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

SimpleAdapter adapter = new SimpleAdapter(context, fillMaps, R.layout.result, from, to); 
mListView.setAdapter(adapter); 

Here mListView是您預定義的ListView。 隨時分享你的疑慮,如果有的話。

+0

還沒有嘗試過,但我試過的其他代碼永遠不會通過JSONArray names = new JSONArray(jsonString); - 值[{java.lang.String不能轉換爲JSONArray – lucas 2013-05-03 17:15:48

+0

不,我的壞 - 這可能也會起作用。將測試並返回 – lucas 2013-05-03 18:02:34

+0

該錯誤是由於您的字符串。每個雙引號都應該前面加一個\以標記爲字符串的一部分,而不是字符串的開頭或結尾。用'[{\「name \」:\「john \」},{\「name \」:\「fred \」},{\「name \」:\「sam \」}]替換您的字符串' – 2013-05-03 18:03:47

2

如果你擁有了它作爲一個字符串,你應該能夠將其與像這樣解析到JSONObject

JSONObject jObj = null; 

// try parse the string to a JSON object 
try { 
    jObj = new JSONObject(json); 
    Log.i(TAG, "JSON Data Parsed: " + jObj.toString()); 
} catch (JSONException e) { 
    Log.e("JSON Parser", "Error parsing data " + e.toString()); 
} 

我還要把數據(在你的例子)到一個數組,所以它看起來是這樣的:

{"names": [{"name": "john"},{"name": "fred"},{"name": "sam"}]} 

然後再次讀取你的對象,你可以把它變成一個數組(或別的東西,我猜的)像這樣的東西:

// create an empty list 
ArrayList<String> l = new ArrayList<String>(); 
// pull the array with the key 'names' 
JSONArray array = jObj.getJSONArray("names"); 
// loop through the new array 
for(int i = 0; i < array.length(); i++){ 
    // pull a value from the array based on the key 'name' 
    l.add(array.getJSONObject(i).getString("name")); 
} 

希望至少有一些幫助(或至少指出你在正確的方向)。這裏也有很多資源。

編輯:

閱讀上JSON格式。 []表示數組,{}表示對象,所以你有一個對象數組。這就是爲什麼我建議改變你的格式。如果你設置了你的格式,可以選擇Mr.Me發佈的答案,或者只是將字符串分成特殊字符,然後將它們放入數組中。

+0

感謝您的意見。相信我,我看了很多帖子並提供瞭解決方案。問題是我無法改變JSON的結構(或者我可以,但是它會破壞我試圖做的目的)。我收到一個字符串,但可能是錯誤的方式?我已更新我的帖子以顯示我如何獲取文件內容。你發佈的原始代碼給我一個錯誤:Value [{java.lang。字符串不能轉換爲JSONObject – lucas 2013-05-03 16:29:06

+0

@lucas我更新了我的答案 – burmat 2013-05-03 16:49:29

+0

是的,我知道數組和對象之間的區別。這就是爲什麼我看過的例子中有那麼幾個沒有任何用處。我沒有設置我的格式,但我不創建它,所以我不想進入並手動更改它。它看起來像這樣工作,但:jObj = new JSONObject()。put(「names」,jString); (完全未在更廣泛的應用程序中測試,但日誌確定)。如果我錯過了一些東西,請告訴我,否則再次感謝您的幫助。 – lucas 2013-05-03 16:53:17

2

的問題是,上面的JSON結構代表JSONArray,而不是一個JSONObject

JSON Syntax

所以讓你jstring只是這樣做

JSONArray array = new JSONArray(jString); 
for(int i=0; i< array.length(); i++){ 
    JSONObject obj = array.getJSONObject(i); 
    String value = obj.getString("name"); 
} 
+0

這是正確的,應該接受 – burmat 2013-05-03 16:50:17

+0

nope。這給了我值[{java.lang.String不能轉換爲JSONArray(當我嘗試循環jObj = new JSONObject()。put(「names」,jString); – lucas 2013-05-03 17:05:47

+0

該代碼是100%正常的,請仔細檢查您的數據表示形式,如果您將文件中的數據添加到問題 – 2013-05-03 17:27:14

相關問題