Android学习——XML与JSON解析

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

猜你喜欢

转载自blog.csdn.net/UUUUUltraman/article/details/89151688