Android[中级教程]第八章 Json数据的处理
16lz
2021-12-04
Android[中级教程]第八章 Json数据的处理
分类:Android中级 2011-10-08 00:29 727人阅读 评论(2) 收藏 举报经过上几章的学习,相信同学们对XML解析已经得心应手了,但今天我们要解析Json数据,因为Json数据占用数据量小,因此在Android中主要数据通信还是以Json为主,而且Json数据可以跟Android进行AJAX互动,相当方便哦,好了,不多说了,看图跟代码:
先上图:
首先定义了Json数据:
view plain- {"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可以很方便地存储和管理数据
view plain- publicclassPerson
- {
- privateStringid;
- privateStringstatus;
- privateStringname;
- privateStringtool;
- privateStringnumber;
- publicStringgetId()
- {
- returnid;
- }
- publicvoidsetId(Stringid)
- {
- this.id=id;
- }
- publicStringgetStatus()
- {
- returnstatus;
- }
- publicvoidsetStatus(Stringstatus)
- {
- this.status=status;
- }
- publicStringgetName()
- {
- returnname;
- }
- publicvoidsetName(Stringname)
- {
- this.name=name;
- }
- publicStringgetTool()
- {
- returntool;
- }
- publicvoidsetTool(Stringtool)
- {
- this.tool=tool;
- }
- publicStringgetNumber()
- {
- returnnumber;
- }
- publicvoidsetNumber(Stringnumber)
- {
- this.number=number;
- }
- @Override
- publicStringtoString()
- {
- return"Person[id="+id+",status="+status+",name="+name
- +",tool="+tool+",number="+number+"]";
- }
- }
接下来就是 Json的处理了,定义了一个JsonHandler类
view plain- importjava.io.BufferedReader;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.util.ArrayList;
- importjava.util.List;
- importorg.json.JSONArray;
- importorg.json.JSONObject;
- publicclassJsonHandler
- {
- privateInputStreaminput;
- privateList<Person>persons;
- privatePersonperson;
- publicJsonHandler()
- {
- }
- publicJsonHandler(InputStreaminput)
- {
- this.input=input;
- }
- publicvoidsetInput(InputStreaminput)
- {
- this.input=input;
- }
- publicList<Person>getPersons()
- {
- persons=newArrayList<Person>();
- try
- {
- //自定义方法,从输入流中取得字符串
- Stringjson_str=getJsonString(input);
- //通过字符串生成Json对象
- JSONObjectobject=newJSONObject(json_str);
- //将Json对象中的persons数据转换成Json数组
- JSONArrayarray=object.getJSONArray("persons");
- //数组长度
- intlength=array.length();
- for(inti=0;i<length;i++)
- {
- //将每一个数组再转换成Json对象
- JSONObjectobj=array.getJSONObject(i);
- person=newPerson();
- 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);
- }
- returnpersons;
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- returnnull;
- }
- /**
- *将输入流中数据整合成字符串
- *
- *@paraminput
- *输入流
- *@return
- *@throwsException
- */
- privateStringgetJsonString(InputStreaminput)throwsException
- {
- BufferedReaderreader=newBufferedReader(newInputStreamReader(input));
- StringBuildersb=newStringBuilder();
- for(Strings=reader.readLine();s!=null;s=reader.readLine())
- {
- sb.append(s);
- }
- returnsb.toString();
- }
- }
OK,到这里数据应该能解析出来了,可以通过测试类来测试一下,呵呵,我还是比较喜欢边测试边做下一步开发
view plain- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.util.List;
- importandroid.os.Environment;
- importandroid.test.AndroidTestCase;
- publicclassHandlerTestextendsAndroidTestCase
- {
- publicvoidtestJsonGetPersons()
- {
- //取得当前SD目录下的文件路径
- FileSD_Files=Environment.getExternalStorageDirectory();
- //取得persons.xml文件的路径,这里我是存在sdcard/data.json
- Stringfile_path=SD_Files.getName()+File.separator+"data.json";
- try
- {
- FileInputStreamfis=newFileInputStream(newFile(file_path));
- JsonHandlerjsonHandler=newJsonHandler(fis);
- List<Person>persons=jsonHandler.getPersons();
- System.out.println(persons);
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- }
好,测试没问题了,那我们就上主Activity类了
view plain- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.widget.ListView;
- importandroid.widget.SimpleAdapter;
- publicclassJsonActivityextendsActivity
- {
- privateListViewlistView;
- privateSimpleAdapteradapter;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState)
- {
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.xml_handler);
- listView=(ListView)findViewById(R.id.xml_list);
- try
- {
- //自完义适配方法
- getAdapter();
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- listView.setAdapter(adapter);
- }
- privatevoidgetAdapter()throwsException
- {
- List<Map<String,String>>lists=newArrayList<Map<String,String>>();
- //取得SD卡目录
- FileSD_Files=Environment.getExternalStorageDirectory();
- //取得文件路径
- Stringfile_path=SD_Files.getName()+File.separator+"data.json";
- //Json处理
- FileInputStreamfis=newFileInputStream(newFile(file_path));
- JsonHandlerjsonHandler=newJsonHandler(fis);
- List<Person>persons=jsonHandler.getPersons();
- //将persons中的数据转换到ArrayList<Map<String,String>>中
- //String>>中,因为SimpleAdapter要用这个类型的数据进行适配
- Map<String,String>map;
- for(Personp:persons)
- {
- map=newHashMap<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=newSimpleAdapter(this,lists,R.layout.handler_list_item,
- from,to);
- }
- }
这里面还定义了几个Layout,也一起送上吧:
xml_handler.xml
view plain- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextViewandroid: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>
- <ListViewandroid:id="@+id/xml_list"android:layout_height="wrap_content"
- android:layout_width="match_parent"></ListView>
- </LinearLayout>
handler_list_item.xml
view plain- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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">
- <LinearLayoutandroid:id="@+id/linearLayout1"
- android:layout_height="wrap_content"android:layout_width="match_parent">
- <TextViewandroid: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>
- <TextViewandroid: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>
- <TextViewandroid:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="wrap_content"android:text="TextView"
- android:layout_height="wrap_content"android:id="@+id/item_name"></TextView>
- </LinearLayout>
- <LinearLayoutandroid:id="@+id/linearLayout2"
- android:layout_height="wrap_content"android:layout_width="match_parent">
- <TextViewandroid: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>
- <TextViewandroid: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的数据处理我们也学习完了.
因为找不到比较好的文件服务器,如果哪位同学想要源码的,可以留邮件地址,谢谢
更多相关文章
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- 箭头函数的基础使用
- python起点网月票榜字体反爬案例
- 在Android中使用ORMLite
- Android串口通讯开发整理
- android 使用contentobserver监听数据库内容变化
- 【Android(安卓)Training - 04】保存数据 [ Lesson 2 - 保存文件
- (转)Android从服务器端获取数据的几种方法
- Android(安卓)socket通信 readline方法阻塞