经过上几章的学习,相信同学们对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; www.2cto.com
}
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的数据处理我们也学习完了.
因为找不到比较好的文件服务器,如果哪位同学想要源码的,可以留邮件地址,谢谢
摘自:kangkangz4的专栏