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

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

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

先上图:

首先定义了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. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. 箭头函数的基础使用
  3. python起点网月票榜字体反爬案例
  4. 在Android中使用ORMLite
  5. Android串口通讯开发整理
  6. android 使用contentobserver监听数据库内容变化
  7. 【Android(安卓)Training - 04】保存数据 [ Lesson 2 - 保存文件
  8. (转)Android从服务器端获取数据的几种方法
  9. Android(安卓)socket通信 readline方法阻塞

随机推荐

  1. Android大图加载方法
  2. Android直播推流学习
  3. android 自定义View之SubmitView
  4. 还在用枚举?我早就抛弃了!(Android 注解详解
  5. Android2.1烧入mini2440
  6. Android Studio代码调试大全
  7. Android从0到完整项目(1)使用Android(安卓)
  8. iPhone和Android
  9. Ubuntu Linux下android源码下载方法
  10. 《Android 4 高级编程(第3版)》试读