经过上几章的学习,相信同学们对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; -
} -
-
-
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.getExternalStorageDirect ory(); -
// 取得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.getExternalStorageDirect ory(); -
//取得文件路径 -
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的数据处理我们也学习完了.