概述
Android[中级教程]第八章 Json数据的处理
分类: Android中级
2011-10-08 00:29
727人阅读
评论(2)
收藏
举报
经过上几章的学习,相信同学们对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的数据处理我们也学习完了.
因为找不到比较好的文件服务器,如果哪位同学想要源码的,可以留邮件地址,谢谢
最后
以上就是糟糕橘子为你收集整理的Android[中级教程]第八章 Json数据的处理的全部内容,希望文章能够帮你解决Android[中级教程]第八章 Json数据的处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复