经过上几章的学习,相信同学们对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;}@Overridepublic 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.jsonString 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;@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.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>中的keyString[] from = { "id", "status", "name", "tool", "number" };// list_item.xml中对应的控件IDint[] 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的数据处理我们也学习完了.

源码下载

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. 箭头函数的基础使用
  3. python起点网月票榜字体反爬案例
  4. 《Android开发从零开始》——25.数据存储(4)
  5. Android系统配置数据库注释(settings.db)
  6. Android中不同应用间实现SharedPreferences数据共享
  7. android图表ichartjs
  8. Android内容提供者源码
  9. Android中文API(144) —— JsonWriter

随机推荐

  1. Activity启动模式 及 Intent Flags 与 栈
  2. Android 页面自动跳转方法(比如进入app的
  3. Android底部导航BottomNavigationBar的使
  4. Android(安卓)自定义权限 ( ) 和 Android
  5. 0基础,安卓搭建环境,运行HelloWord
  6. Android Gradle 配置打包输出名称格式
  7. Android——组件之Service
  8. 手动部署Android-apk应用到模拟器
  9. Android音频捕获(录音)(转)
  10. android 新闻系统客户端,服务器端采用JSP