XML与JSON解析
XML解析
1.XML解析的两种机制
XML是一种常用的存储数据方式,在Android平台中内部很多地方使用了XML存储,比如轻量级的SharedPreferences类的有储就是使用了XML文件。
XML解析主要有三种方式:SAX(Simple API for XML)、DOM(Document Object Model)和Android附带的PULL解析器解析XML文件。
常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方式,SAX 读取是单向的,优点是不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。
DOM方式会把整个XML文件加载到内存中去,优点是可以任意读取节点,但缺点就是会消耗内存。
PULL常常用在移动设备对于节点处理比较好,类似SAX方式,同样很节省内存。
2.PULL解析
除了可以使用SAX和DOM解析XML文件,大家也可以使用Android内置的PULL解析器解析XML文件。PULL解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
添加一个待解析的xml文件
<people>
<person personid="1">
<name>Tom</name>
<age>21</age>
<sex>男</sex>
<tel>13895276294</tel>
</person>
<person personid="2">
<name>Tony</name>
<age>21</age>
<sex>男</sex>
<tel>13862949527</tel>
</person>
</people>
People类
package com.example.files;
public class People {
int id;
String name;
int age;
String sex;
String tel;
@Override
public String toString() {
return "Person{" +
"personid="+id+
",name='"+name+"\'"+
",sex='"+sex+"\'"+
",age='"+age+"\'"+
",tel='"+tel+"\'"+
"}";
}
}
创建一个PULL解析器
package com.example.files;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
//使用PULL解析XML文件
public void pullParseClick(View view){
ArrayList<People> list=parser();
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
private ArrayList<People> parser() {
ArrayList<People> list=new ArrayList<>();
People p=null;
//创建一个PULL解析器
XmlPullParser pullParser=Xml.newPullParser();
// StringReader stringReader=new StringReader(xml);
InputStream inputStream=getResources().openRawResource(R.raw.people);
try {
//设置需要解析的文件流
pullParser.setInput(inputStream,"UTF-8");
//获取当前的事件类型
int eventType=pullParser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_TAG:
String tag=pullParser.getName();
if ("person".equals(tag)){
p=new People();
p.id=Integer.parseInt(pullParser.getAttributeValue(null,"personid"));
}else if ("name".equals(tag)){
p.name=pullParser.nextText();
}else if ("age".equals(tag)){
p.age=Integer.parseInt(pullParser.nextText());
}else if ("sex".equals(tag)){
p.sex=pullParser.nextText();
}else if ("tel".equals(tag)){
p.tel=pullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(pullParser.getName())){
list.add(p);
}
break;
}
//获取下一个事件类型
eventType=pullParser.next();
}
inputStream.close();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
JSON解析
什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON 官方http://wwjson.org
JSON数据格式的特点
JSON建枸于两种结构:1、“名称/值”对的集合2、值的有序列表(数组)
JSON表示名称/值对的方式:{ “firstName’: “MA’, 'lastName:-VINCE. 'email: 'finally_ [email protected]” }
表示数组
{ “user”:[ { “firstName”: “MA”, “lastName”:“WElGE”, “email”: "[email protected]” },
{ “firstName”: “ZHANG”, “lastName”:“AKE”, “email”: “ake@qq .com”}]
}
JSONReader是android.util包下的一个用于解析JSON的工具类。
JsonReader reader=new JsonReader(new StringReader(jsonData));
public void JsonReaderClick(View view){
ArrayList<Person2> list = jsonReader();
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
}
//使用JsonReader解析
private ArrayList<Person2> jsonReader(){
// String json="{ \"user:[ { \"firstName': 'MA, 'lastName':\"WElGE;, 'email': \"[email protected]\" ), { 'firstName': 'ZHANG, '\"lastName:AKE', 'email': \"ake@qq .com\"}]}";
ArrayList<Person2> list=new ArrayList<>();
//创建JsonReader对象
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.person2));
JsonReader jsonReader=new JsonReader(r);
try {
jsonReader.beginObject();
if (jsonReader.hasNext()){
if ("user".equals(jsonReader.nextName())){
jsonReader.beginArray();//开始解析数组
while (jsonReader.hasNext()){
Person2 p2=new Person2();
jsonReader.beginObject();//开始解析数据
while (jsonReader.hasNext()){
String name=jsonReader.nextName();
if ("firstName".equals(name)){
p2.firstName=jsonReader.nextString();
}else if ("lastname".equals(name)){
p2.lastName=jsonReader.nextString();
}else if("email".equals(name)){
p2.email=jsonReader.nextString();
}else{
jsonReader.nextString();
}
}
jsonReader.endObject();//结束对象的解析
list.add(p2);
}
jsonReader.endArray();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
生成JSON数据
//生成json数据
public void createJsonClick(View view){
ArrayList<Person2> list=new ArrayList<>();
Person2 p1=new Person2();
p1.firstName="ma";
p1.lastName="vince";
p1.email="[email protected]";
Person2 p2=new Person2();
p2.firstName="ma";
p2.lastName="vince";
p2.email="[email protected]";
list.add(p1);
list.add(p2);
JSONObject jsonObject=new JSONObject();
JSONArray jsonArray=new JSONArray();
try {
for (int i = 0; i <list.size() ; i++) {
Person2 p=list.get(i);
JSONObject obj=new JSONObject();
try {
obj.put("firstName",p.firstName);
obj.put("lastName",p.lastName);
obj.put("email",p.email);
} catch (JSONException e) {
e.printStackTrace();
}
jsonArray.put(obj);
}
jsonObject.put("person",jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
//输出
System.out.println(jsonObject.toString());
}
GSON的使用
使用Gson解析Json
public void gsonParseJsonClick(View view){
Gson gson=new Gson();
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.person3));
Type type=new TypeToken<ArrayList<Person2>>(){}.getType();
ArrayList<Person2> list=gson.fromJson(r,type);
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
}
GSON生成JSON
public void gsonToJsonClick(View view){
ArrayList<Person2> list=new ArrayList<>();
Person2 p1=new Person2();
p1.firstName="ma";
p1.lastName="vince";
p1.email="[email protected]";
Person2 p2=new Person2();
p2.firstName="ma";
p2.lastName="vince";
p2.email="[email protected]";
list.add(p1);
list.add(p2);
Gson gson=new Gson();
Type type=new TypeToken<ArrayList<Person2>>(){}.getType();
String json=gson.toJson(list,type);
System.out.println(json);
}
JSON vs XML
从以下6点比较JSON与XML :
1、JSON和XML的数据可读性基本相同
2、JSON和XML同样拥有丰富的解析手段
3、JSON相对于XML来讲, 数据的体积小
4、JSON与JavaScript的交互更加方便
5、JSON对数据的描述性比XML较差
6、JSON的速度要远远快于XML