程序功能:读取本地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 *@paramfileName5 *@return
6 */
7 privateString getJson(String fileName) {8
9 StringBuilder stringBuilder = newStringBuilder();10 try{11 BufferedReader bf = new BufferedReader(newInputStreamReader(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 returnstringBuilder.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 *@paramstr5 */
6 private voidsetData(String str) {7 try{8 JSONArray array = newJSONArray(str);9 int len =array.length();10 Mapmap;11 for (int i = 0; i < len; i++) {12 JSONObject object =array.getJSONObject(i);13 map = new HashMap();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中,下面给出完整代码,
json.xml
1
2
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content" >
11
12
13
json_item.xml
1
2
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent" >
5
6
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:layout_marginLeft="15dp" />
11
12
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
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
java代码
1 public class JSONTextActivity extendsActivity {2
3 privateListView listView;4 private List>data;5 private final static String fileName = "json.txt";6 privateProgressDialog pd;7
8 @Override9 protected voidonCreate(Bundle savedInstanceState) {10 super.onCreate(savedInstanceState);11 setContentView(R.layout.json);12 init();13 pd.show();14 newDataThread().start();15
16 }17
18 /**
19 * 初始化20 */
21 private voidinit() {22 listView =(ListView) findViewById(R.id.listView);23 data = new ArrayList>();24 pd = new ProgressDialog(this);25 pd.setMessage("数据加载中……");26
27 }28
29 /**
30 * 加载数据线程31 */
32 class DataThread extendsThread {33
34 @Override35 public voidrun() {36 String jsonStr =getJson(fileName);37 setData(jsonStr);38 dataHandler.sendMessage(dataHandler.obtainMessage());39 }40
41 }42
43 /**
44 * 加载数据线程完成处理Handler45 */
46 Handler dataHandler = newHandler() {47
48 public voidhandleMessage(android.os.Message msg) {49 if (pd != null) {50 pd.dismiss();51 }52 SimpleAdapter adapter = newSimpleAdapter(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 *@paramfileName65 *@return
66 */
67 privateString getJson(String fileName) {68
69 StringBuilder stringBuilder = newStringBuilder();70 try{71 BufferedReader bf = new BufferedReader(newInputStreamReader(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 returnstringBuilder.toString();81 }82
83 /**
84 * 将JSON字符串转化为Adapter数据85 *86 *@paramstr87 */
88 private voidsetData(String str) {89 try{90 JSONArray array = newJSONArray(str);91 int len =array.length();92 Mapmap;93 for (int i = 0; i < len; i++) {94 JSONObject object =array.getJSONObject(i);95 map = new HashMap();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 }
运行效果如下: