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

分类:Android中级 727人阅读 评论(2) 收藏 举报

经过上几章的学习,相信同学们对XML解析已经得心应手了,但今天我们要解析Json数据,因为Json数据占用数据量小,因此在Android中主要数据通信还是以Json为主,而且Json数据可以跟Android进行AJAX互动,相当方便哦,好了,不多说了,看图跟代码:

先上图:

Android[中级教程]第八章 Json数据的处理_第1张图片

首先定义了Json数据:

view plain
  1. {"persons":[
  2. {"id":"1","status":"大徙弟","name":"孙悟空","tool":"金箍棒","number":"杀死了50只妖怪"},
  3. {"id":"2","status":"二徙弟","name":"猪八戒","tool":"九齿钉耙","number":"杀死了43只妖怪"},
  4. {"id":"3","status":"三徙弟","name":"沙和尚","tool":"降妖宝杖","number":"杀死了33只妖怪"}
  5. ]}

接下来就是定义javaBean了,对于java开发来说,javaBean可以很方便地存储和管理数据

view plain
  1. publicclassPerson
  2. {
  3. privateStringid;
  4. privateStringstatus;
  5. privateStringname;
  6. privateStringtool;
  7. privateStringnumber;
  8. publicStringgetId()
  9. {
  10. returnid;
  11. }
  12. publicvoidsetId(Stringid)
  13. {
  14. this.id=id;
  15. }
  16. publicStringgetStatus()
  17. {
  18. returnstatus;
  19. }
  20. publicvoidsetStatus(Stringstatus)
  21. {
  22. this.status=status;
  23. }
  24. publicStringgetName()
  25. {
  26. returnname;
  27. }
  28. publicvoidsetName(Stringname)
  29. {
  30. this.name=name;
  31. }
  32. publicStringgetTool()
  33. {
  34. returntool;
  35. }
  36. publicvoidsetTool(Stringtool)
  37. {
  38. this.tool=tool;
  39. }
  40. publicStringgetNumber()
  41. {
  42. returnnumber;
  43. }
  44. publicvoidsetNumber(Stringnumber)
  45. {
  46. this.number=number;
  47. }
  48. @Override
  49. publicStringtoString()
  50. {
  51. return"Person[id="+id+",status="+status+",name="+name
  52. +",tool="+tool+",number="+number+"]";
  53. }
  54. }

接下来就是 Json的处理了,定义了一个JsonHandler类

view plain
  1. importjava.io.BufferedReader;
  2. importjava.io.InputStream;
  3. importjava.io.InputStreamReader;
  4. importjava.util.ArrayList;
  5. importjava.util.List;
  6. importorg.json.JSONArray;
  7. importorg.json.JSONObject;
  8. publicclassJsonHandler
  9. {
  10. privateInputStreaminput;
  11. privateList<Person>persons;
  12. privatePersonperson;
  13. publicJsonHandler()
  14. {
  15. }
  16. publicJsonHandler(InputStreaminput)
  17. {
  18. this.input=input;
  19. }
  20. publicvoidsetInput(InputStreaminput)
  21. {
  22. this.input=input;
  23. }
  24. publicList<Person>getPersons()
  25. {
  26. persons=newArrayList<Person>();
  27. try
  28. {
  29. //自定义方法,从输入流中取得字符串
  30. Stringjson_str=getJsonString(input);
  31. //通过字符串生成Json对象
  32. JSONObjectobject=newJSONObject(json_str);
  33. //将Json对象中的persons数据转换成Json数组
  34. JSONArrayarray=object.getJSONArray("persons");
  35. //数组长度
  36. intlength=array.length();
  37. for(inti=0;i<length;i++)
  38. {
  39. //将每一个数组再转换成Json对象
  40. JSONObjectobj=array.getJSONObject(i);
  41. person=newPerson();
  42. person.setId(obj.getString("id"));
  43. person.setStatus(obj.getString("status"));
  44. person.setName(obj.getString("name"));
  45. person.setTool(obj.getString("tool"));
  46. person.setNumber(obj.getString("number"));
  47. persons.add(person);
  48. }
  49. returnpersons;
  50. }catch(Exceptione)
  51. {
  52. e.printStackTrace();
  53. }
  54. returnnull;
  55. }
  56. /**
  57. *将输入流中数据整合成字符串
  58. *
  59. *@paraminput
  60. *输入流
  61. *@return
  62. *@throwsException
  63. */
  64. privateStringgetJsonString(InputStreaminput)throwsException
  65. {
  66. BufferedReaderreader=newBufferedReader(newInputStreamReader(input));
  67. StringBuildersb=newStringBuilder();
  68. for(Strings=reader.readLine();s!=null;s=reader.readLine())
  69. {
  70. sb.append(s);
  71. }
  72. returnsb.toString();
  73. }
  74. }

OK,到这里数据应该能解析出来了,可以通过测试类来测试一下,呵呵,我还是比较喜欢边测试边做下一步开发

view plain
  1. importjava.io.File;
  2. importjava.io.FileInputStream;
  3. importjava.util.List;
  4. importandroid.os.Environment;
  5. importandroid.test.AndroidTestCase;
  6. publicclassHandlerTestextendsAndroidTestCase
  7. {
  8. publicvoidtestJsonGetPersons()
  9. {
  10. //取得当前SD目录下的文件路径
  11. FileSD_Files=Environment.getExternalStorageDirectory();
  12. //取得persons.xml文件的路径,这里我是存在sdcard/data.json
  13. Stringfile_path=SD_Files.getName()+File.separator+"data.json";
  14. try
  15. {
  16. FileInputStreamfis=newFileInputStream(newFile(file_path));
  17. JsonHandlerjsonHandler=newJsonHandler(fis);
  18. List<Person>persons=jsonHandler.getPersons();
  19. System.out.println(persons);
  20. }catch(Exceptione)
  21. {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

好,测试没问题了,那我们就上主Activity类了

view plain
  1. importjava.io.File;
  2. importjava.io.FileInputStream;
  3. importjava.util.ArrayList;
  4. importjava.util.HashMap;
  5. importjava.util.List;
  6. importjava.util.Map;
  7. importandroid.app.Activity;
  8. importandroid.os.Bundle;
  9. importandroid.os.Environment;
  10. importandroid.widget.ListView;
  11. importandroid.widget.SimpleAdapter;
  12. publicclassJsonActivityextendsActivity
  13. {
  14. privateListViewlistView;
  15. privateSimpleAdapteradapter;
  16. @Override
  17. protectedvoidonCreate(BundlesavedInstanceState)
  18. {
  19. //TODOAuto-generatedmethodstub
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.xml_handler);
  22. listView=(ListView)findViewById(R.id.xml_list);
  23. try
  24. {
  25. //自完义适配方法
  26. getAdapter();
  27. }catch(Exceptione)
  28. {
  29. e.printStackTrace();
  30. }
  31. listView.setAdapter(adapter);
  32. }
  33. privatevoidgetAdapter()throwsException
  34. {
  35. List<Map<String,String>>lists=newArrayList<Map<String,String>>();
  36. //取得SD卡目录
  37. FileSD_Files=Environment.getExternalStorageDirectory();
  38. //取得文件路径
  39. Stringfile_path=SD_Files.getName()+File.separator+"data.json";
  40. //Json处理
  41. FileInputStreamfis=newFileInputStream(newFile(file_path));
  42. JsonHandlerjsonHandler=newJsonHandler(fis);
  43. List<Person>persons=jsonHandler.getPersons();
  44. //将persons中的数据转换到ArrayList<Map<String,String>>中
  45. //String>>中,因为SimpleAdapter要用这个类型的数据进行适配
  46. Map<String,String>map;
  47. for(Personp:persons)
  48. {
  49. map=newHashMap<String,String>();
  50. map.put("id",p.getId());
  51. map.put("status",p.getStatus());
  52. map.put("name",p.getName());
  53. map.put("tool",p.getTool());
  54. map.put("number",p.getNumber());
  55. lists.add(map);
  56. }
  57. //HashMap<String,String>中的key
  58. String[]from={"id","status","name","tool","number"};
  59. //list_item.xml中对应的控件ID
  60. int[]to={R.id.item_id,R.id.item_status,R.id.item_name,
  61. R.id.item_tool,R.id.item_number};
  62. adapter=newSimpleAdapter(this,lists,R.layout.handler_list_item,
  63. from,to);
  64. }
  65. }

这里面还定义了几个Layout,也一起送上吧:

xml_handler.xml

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  6. android:layout_width="wrap_content"android:text="唐僧的三个徙弟"
  7. android:layout_height="wrap_content"android:id="@+id/textView1"
  8. android:paddingLeft="10dip"android:paddingBottom="10dip"></TextView>
  9. <ListViewandroid:id="@+id/xml_list"android:layout_height="wrap_content"
  10. android:layout_width="match_parent"></ListView>
  11. </LinearLayout>

handler_list_item.xml

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="match_parent"
  4. android:layout_height="match_parent"android:paddingLeft="10dip"
  5. android:paddingRight="10dip">
  6. <LinearLayoutandroid:id="@+id/linearLayout1"
  7. android:layout_height="wrap_content"android:layout_width="match_parent">
  8. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  9. android:layout_width="wrap_content"android:text="TextView"
  10. android:layout_height="wrap_content"android:id="@+id/item_id"android:paddingRight="30dip"></TextView>
  11. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  12. android:layout_width="wrap_content"android:text="TextView"
  13. android:layout_height="wrap_content"android:id="@+id/item_status"android:paddingRight="30dip"></TextView>
  14. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  15. android:layout_width="wrap_content"android:text="TextView"
  16. android:layout_height="wrap_content"android:id="@+id/item_name"></TextView>
  17. </LinearLayout>
  18. <LinearLayoutandroid:id="@+id/linearLayout2"
  19. android:layout_height="wrap_content"android:layout_width="match_parent">
  20. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  21. android:layout_width="wrap_content"android:text="TextView"
  22. android:layout_height="wrap_content"android:id="@+id/item_tool"android:paddingRight="30dip"></TextView>
  23. <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
  24. android:layout_width="wrap_content"android:text="TextView"
  25. android:layout_height="wrap_content"android:id="@+id/item_number"></TextView>
  26. </LinearLayout>
  27. </LinearLayout>

好了,Json的数据处理我们也学习完了.

因为找不到比较好的文件服务器,如果哪位同学想要源码的,可以留邮件地址,谢谢

更多相关文章

  1. (转)Android从服务器端获取数据的几种方法
  2. 【Android Training - 04】保存数据 [ Lesson 2 - 保存文件]
  3. Android adb forward转发TCP端口连接数据
  4. Android:SNS客户端开发四:数据库操作(二)
  5. Android之MVP模式实现登录和网络数据加载
  6. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
  7. 全程不用usb数据线,adb通过网络连接Android设备
  8. android(NDK+JNI)---Android使用JNI实现Java与C之间传递数据

随机推荐

  1. Android学习笔记(四) android 更换桌面壁
  2. Android中编译工具链的改动----LLVM份量
  3. Android调用系统程序
  4. android 中让activity全屏幕显示
  5. android 打开 url 方式
  6. Android PDF 阅读器源码
  7. Android通过摇晃手机的频率来控制声音的
  8. Android View onMeasure 方法
  9. Android 让TextView变成Dialog
  10. Android系统开发之修改调试SystemUI