程序功能:读取本地JSON文件,并显示到LsitView上,下面详细介绍:
1 [ 2 { 3 "operator":"admin1", 4 "loginDate":"2012-10-20 10:28:10", 5 "logoutDate":"2012-10-20 10:32:10" 6 }, 7 { 8 "operator":"admin2", 9 "loginDate":"2012-10-22 10:20:10", 10 "logoutDate":"2012-10-22 10:32:10" 11 }, 12 { 13 "operator":"admin3", 14 "loginDate":"2012-10-23 10:28:10", 15 "logoutDate":"2012-10-23 10:32:10" 16 }, 17 { 18 "operator":"admin4", 19 "loginDate":"2012-10-20 10:28:10", 20 "logoutDate":"2012-10-20 10:32:10" 21 } 22 ]
先准备内容如上的"json.txt"文件,放到项目的assets目录下(此处可以是本地SD卡只是读取的方式有些异同)。首先要读出json.txt的内容,要访问assets下的资源,需要使用AssetManager类的open(filename)方法,文中省去(AssetManager assetManager = getAssets();)步骤,简写为Context.getAssets().open(filename)。open方法返回一个输入流,我们便可以通过这个流来得到json字符串。
1 /** 2 * 读取本地文件中JSON字符串 3 * 4 * @param fileName 5 * @return 6 */ 7 private String getJson(String fileName) { 8 9 StringBuilder stringBuilder = new StringBuilder(); 10 try { 11 BufferedReader bf = new BufferedReader(new InputStreamReader( 12 getAssets().open(fileName))); 13 String line; 14 while ((line = bf.readLine()) != null) { 15 stringBuilder.append(line); 16 } 17 } catch (IOException e) { 18 e.printStackTrace(); 19 } 20 return stringBuilder.toString(); 21 }
获得JSON字符串,我们便可以解析,进而得到对我们有用的数据,Adnroid已经加入了org.json.*,所以我对json的操作也变得简单起来,使用JSONArray array = new JSONArray(str) 就能把我们刚刚得到的JSON串传化为JSONArray,请注意观察我们的josn.txt的内容,其中包括了四组数据结构相同的数据,每一组数据看成一个JSONObject(包含了若干键值对,很像Map),而这些JSONObject便组成了一组JSONArray数组,所以我们只要遍历这个array就可以得到其中的所有JSONObject了,有了JSONObject就可以通过Key获得对应的Value值了。
1 /** 2 * 将JSON字符串转化为Adapter数据 3 * 4 * @param str 5 */ 6 private void setData(String str) { 7 try { 8 JSONArray array = new JSONArray(str); 9 int len = array.length(); 10 Map<String, String> map; 11 for (int i = 0; i < len; i++) { 12 JSONObject object = array.getJSONObject(i); 13 map = new HashMap<String, String>(); 14 map.put("operator", object.getString("operator")); 15 map.put("loginDate", object.getString("loginDate")); 16 map.put("logoutDate", object.getString("logoutDate")); 17 data.add(map); 18 } 19 } catch (JSONException e) { 20 e.printStackTrace(); 21 } 22 }
填充完我们的数据集合,就可以放置到Adapter中,并显示到LsitView中,下面给出完整代码,

1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <ListView 8 android:id="@+id/listView" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" > 11 </ListView> 12 13 </LinearLayout>

1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" > 5 6 <TextView 7 android:id="@+id/operator_tv" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:layout_marginLeft="15dp" /> 11 12 <TextView 13 android:id="@+id/loginDate_tv" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:layout_alignLeft="@id/operator_tv" 17 android:layout_below="@id/operator_tv" /> 18 19 <TextView 20 android:id="@+id/logoutDate_tv" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:layout_alignTop="@+id/loginDate_tv" 24 android:layout_marginLeft="15dp" 25 android:layout_toRightOf="@+id/loginDate_tv" /> 26 27 </RelativeLayout>

1 public class JSONTextActivity extends Activity { 2 3 private ListView listView; 4 private List<Map<String, String>> data; 5 private final static String fileName = "json.txt"; 6 private ProgressDialog pd; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.json); 12 init(); 13 pd.show(); 14 new DataThread().start(); 15 16 } 17 18 /** 19 * 初始化 20 */ 21 private void init() { 22 listView = (ListView) findViewById(R.id.listView); 23 data = new ArrayList<Map<String, String>>(); 24 pd = new ProgressDialog(this); 25 pd.setMessage("数据加载中……"); 26 27 } 28 29 /** 30 * 加载数据线程 31 */ 32 class DataThread extends Thread { 33 34 @Override 35 public void run() { 36 String jsonStr = getJson(fileName); 37 setData(jsonStr); 38 dataHandler.sendMessage(dataHandler.obtainMessage()); 39 } 40 41 } 42 43 /** 44 * 加载数据线程完成处理Handler 45 */ 46 Handler dataHandler = new Handler() { 47 48 public void handleMessage(android.os.Message msg) { 49 if (pd != null) { 50 pd.dismiss(); 51 } 52 SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), 53 data, R.layout.json_item, new String[] { "operator", 54 "loginDate", "logoutDate" }, new int[] { 55 R.id.operator_tv, R.id.loginDate_tv, 56 R.id.logoutDate_tv }); 57 listView.setAdapter(adapter); 58 } 59 }; 60 61 /** 62 * 读取本地文件中JSON字符串 63 * 64 * @param fileName 65 * @return 66 */ 67 private String getJson(String fileName) { 68 69 StringBuilder stringBuilder = new StringBuilder(); 70 try { 71 BufferedReader bf = new BufferedReader(new InputStreamReader( 72 getAssets().open(fileName))); 73 String line; 74 while ((line = bf.readLine()) != null) { 75 stringBuilder.append(line); 76 } 77 } catch (IOException e) { 78 e.printStackTrace(); 79 } 80 return stringBuilder.toString(); 81 } 82 83 /** 84 * 将JSON字符串转化为Adapter数据 85 * 86 * @param str 87 */ 88 private void setData(String str) { 89 try { 90 JSONArray array = new JSONArray(str); 91 int len = array.length(); 92 Map<String, String> map; 93 for (int i = 0; i < len; i++) { 94 JSONObject object = array.getJSONObject(i); 95 map = new HashMap<String, String>(); 96 map.put("operator", object.getString("operator")); 97 map.put("loginDate", object.getString("loginDate")); 98 map.put("logoutDate", object.getString("logoutDate")); 99 data.add(map); 100 } 101 } catch (JSONException e) { 102 e.printStackTrace(); 103 } 104 } 105 }
运行效果如下: