频道栏目
首页 > 资讯 > Android > 正文

Android[中级教程]第八章 Json数据的处理

11-10-09        来源:[db:作者]  
收藏   我要投稿

 

经过上几章的学习,相信同学们对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的专栏

相关TAG标签
上一篇:Android[中级教程]第九章 网络数据的处理之HttpClient
下一篇:Android[中级教程]第七章 XML解析之Dom解析器
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站