经过上几章的学习,相信同学们对XML解析已经得心应手了,但今天我们要解析Json数据,因为Json数据占用数据量小,因此在Android中主要数据通信还是以Json为主,而且Json数据可以跟Android进行AJAX互动,相当方便哦,好了,不多说了,看图跟代码:
先上图:
首先定义了Json数据:
{ "persons": [ { "id": "1", "status":"大徙弟", "name": "孙悟空", "tool": "金箍棒", "number": "杀死了50只妖怪" }, { "id": "2", "status":"二徙弟", "name": "猪八戒", "tool": "九齿钉耙", "number": "杀死了43只妖怪" }, { "id": "3", "status":"三徙弟", "name": "沙和尚", "tool": "降妖宝杖", "number": "杀死了33只妖怪" } ]}接下来就是定义javaBean了,对于java开发来说,javaBean可以很方便地存储和管理数据
public class Person { private String id; private String status; private String name; private String tool; private String number; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTool() { return tool; } public void setTool(String tool) { this.tool = tool; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Person [id=" + id + ", status=" + status + ", name=" + name + ", tool=" + tool + ", number=" + number + "]"; } }接下来就是 Json的处理了,定义了一个JsonHandler类
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONObject; public class JsonHandler { private InputStream input; private List<Person> persons; private Person person; public JsonHandler() { } public JsonHandler(InputStream input) { this.input = input; } public void setInput(InputStream input) { this.input = input; } public List<Person> getPersons() { persons = new ArrayList<Person>(); try { //自定义方法,从输入流中取得字符串 String json_str = getJsonString(input); //通过字符串生成Json对象 JSONObject object = new JSONObject(json_str); //将Json对象中的persons数据转换成Json数组 JSONArray array = object.getJSONArray("persons"); //数组长度 int length = array.length(); for (int i = 0; i < length; i++) { //将每一个数组再转换成Json对象 JSONObject obj = array.getJSONObject(i); person = new Person(); person.setId(obj.getString("id")); person.setStatus(obj.getString("status")); person.setName(obj.getString("name")); person.setTool(obj.getString("tool")); person.setNumber(obj.getString("number")); persons.add(person); } return persons; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 将输入流中数据整合成字符串 * * @param input * 输入流 * @return * @throws Exception */ private String getJsonString(InputStream input) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(input)); StringBuilder sb = new StringBuilder(); for (String s = reader.readLine(); s != null; s = reader.readLine()) { sb.append(s); } return sb.toString(); } }OK,到这里数据应该能解析出来了,可以通过测试类来测试一下,呵呵,我还是比较喜欢边测试边做下一步开发
import java.io.File; import java.io.FileInputStream; import java.util.List; import android.os.Environment; import android.test.AndroidTestCase; public class HandlerTest extends AndroidTestCase { public void testJsonGetPersons() { // 取得当前SD目录下的文件路径 File SD_Files = Environment.getExternalStorageDirectory(); // 取得persons.xml文件的路径,这里我是存在sdcard/data.json String file_path = SD_Files.getName() + File.separator + "data.json"; try { FileInputStream fis = new FileInputStream(new File(file_path)); JsonHandler jsonHandler = new JsonHandler(fis); List<Person> persons = jsonHandler.getPersons(); System.out.println(persons); } catch (Exception e) { e.printStackTrace(); } } }好,测试没问题了,那我们就上主Activity类了
import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.widget.ListView; import android.widget.SimpleAdapter; public class JsonActivity extends Activity { private ListView listView; private SimpleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.xml_handler); listView = (ListView) findViewById(R.id.xml_list); try { // 自完义适配方法 getAdapter(); } catch (Exception e) { e.printStackTrace(); } listView.setAdapter(adapter); } private void getAdapter() throws Exception { List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); //取得SD卡目录 File SD_Files = Environment.getExternalStorageDirectory(); //取得文件路径 String file_path = SD_Files.getName() + File.separator + "data.json"; //Json处理 FileInputStream fis = new FileInputStream(new File(file_path)); JsonHandler jsonHandler = new JsonHandler(fis); List<Person> persons = jsonHandler.getPersons(); // 将persons中的数据转换到ArrayList<Map<String,String>>中 // String>>中,因为SimpleAdapter要用这个类型的数据进行适配 Map<String, String> map; for (Person p : persons) { map = new HashMap<String, String>(); map.put("id", p.getId()); map.put("status", p.getStatus()); map.put("name", p.getName()); map.put("tool", p.getTool()); map.put("number", p.getNumber()); lists.add(map); } // HashMap<String, String>中的key String[] from = { "id", "status", "name", "tool", "number" }; // list_item.xml中对应的控件ID int[] to = { R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number }; adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to); } }这里面还定义了几个Layout,也一起送上吧:
xml_handler.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="唐僧的三个徙弟" android:layout_height="wrap_content" android:id="@+id/textView1" android:paddingLeft="10dip" android:paddingBottom="10dip"></TextView> <ListView android:id="@+id/xml_list" android:layout_height="wrap_content" android:layout_width="match_parent"></ListView> </LinearLayout>handler_list_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="10dip" android:paddingRight="10dip"> <LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="match_parent"> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/item_id" android:paddingRight="30dip"></TextView> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/item_status" android:paddingRight="30dip"></TextView> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/item_name"></TextView> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_height="wrap_content" android:layout_width="match_parent"> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/item_tool" android:paddingRight="30dip"></TextView> <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:id="@+id/item_number"></TextView> </LinearLayout> </LinearLayout>好了,Json的数据处理我们也学习完了.