在Android应用程序中从SD卡解析json文件

时间:2013-05-03 16:02:21

标签: android json android-sdcard

我在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的一个完整的新手 - 我找到了单独执行这些事情的示例代码,但我不能将它们全部放在一起。任何帮助非常感谢。

3 个答案:

答案 0 :(得分: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发布的答案,或者只是将字符串拆分为特殊字符并将其放入阵列中。

答案 1 :(得分: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");
 }

答案 2 :(得分: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);

此处mListView是您预定义的ListView。 如果有的话,请随时在这里分享您的疑虑。