XML的解析与JSON解析

XML的解析

XML是一种常见的存储数据方式,在Android平台中内部很多地方都使用了XML存储,如轻量级的SharedPreferences类的存储就是使用的XML文件。
XML解析主要有三种方式,SAX(Simple API for XML),DOM(Document Object Mode)和Android附带的PULL解析器解析XML文件。

优点 缺点
SAX 读取为单向性的,不占内存空间,解析属性方便 套嵌多个分支,处理不方便
DOM 将整个XML文件加载如内存中,方便读取任意节点 消耗内存
PULL 解决了SAX与DOM的缺点问题

PULL解析
PULL解析器的运行方式与SAX解析器的运行相似,提供了类似的事件可以使用parser.next()可以进入下一个元素并触发响应事件。当元素开始解析时,调用parser.next()方法获取下一个Text类型的值。

//android提供xml得到xmlpull解析器
XmlPullParser parser = Xml.newPullParser();
//传入文件输入流及xml文件编码
parser.setinput(in,"UTF-8");
/**
pull读到xml后返回EventType
读取到xml的声明返回数字0			STAR_DOCUMENT;
读取到xml的结束返回数字1			END_DOCUMENT
读取到xml的开始标签返回数字2			STAR_TAG
读取到xml的结束标签返回数字3			END_TAG
读取到xml的文本返回数字4			TEXT
*/
int eventType =parser.getEventTypr[];//获取当前的eventType
while(eventType!=XmlPullParser.END_DOCUMENT){
				switch(eventType){...}
				eventType =parser.next();//获取下一个事件的类型
	}
 //使用PULL解析XML文件
    public  void pullParserClick(View view){
       ArrayList list = parser();
       for (int i =0;i parser(){
        ArrayList list =new ArrayList<>();
        Person p =null;

        //创建一个PULL解析器
        XmlPullParser pull = Xml.newPullParser();
     //   StringReader sr =new StringReader(xml);
        InputStream in = getResources().openRawResource(R.raw.person);
        try {
            //设置要解析的文件流
            pull.setInput(in,"UTF-8");
            //获取当前的事件类型
            int eventType = pull.getEventType();

            while (eventType!=XmlPullParser.END_DOCUMENT){

                switch (eventType){
                    case XmlPullParser.START_TAG:
                        String tag = pull.getName();
                        if ("person".equals(tag)){
                            p =new Person();
                            p.personid = Integer.parseInt(pull.getAttributeValue(null,"personid"));
                        }else if ("name".equals(tag)){
                            p.name = pull.nextText();
                        }else if ("age".equals(tag)){
                            p.age =Integer.parseInt(pull.nextText());
                        }else if ("sex".equals(tag)){
                            p.sex=pull.nextText();
                        }else if ("tel".equals(tag)){
                            p.tel= pull.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("person".equals(pull.getName())){
                            list.add(p);
                        }
                        break;
                }

                //获取下一个事件类型
                eventType = pull.next();
            }

JSON解析

JSON是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON构建于两种结构:1.“名称/值”对的集合,2.值的有序列表(数组)。
JSON表示名称/值对的方式:

{"firstName":"MA","lastName":"VINCE","email":"[email protected]"}

表示数组:

{"user":[
		{"firstName":"MA","lastName":"VINCE","email":"[email protected]"}
		{"firstName":"M","lastName":"VINC","email":"[email protected]"}]
}
 /**
     * JsonReader解析JSON
     * @param view
     */
    public void jsonReaderClick(View view){
        ArrayList list =jsonReader();
        for (int i =0;i jsonReader(){
 //       String json ="{ \"user\":[{ \"firstName\":\"MA\",\"lastName\":\"WEIGE\",\"email\":\"[email protected]\"},{\"firstName\":\"ZHANG\",\"lastName\":\"AKE\",\"[email protected]\"}]";
        ArrayList list =new ArrayList<>();
        Reader r =new InputStreamReader(getResources().openRawResource(R.raw.person));
        JsonReader jr =new JsonReader(r);

        try {
            jr.beginArray();//开始解析数组
            while (jr.hasNext()){
                Person p =new Person();
                jr.beginObject();//开始解析对象
                while (jr.hasNext()){
                    String name =jr.nextName();
                    if("firstName".equals(name)){
                            p.firstName =jr.nextString();
                    }else if ("lastName".equals(name)){
                        p.lastName =jr.nextString();
                    }else if ("email".equals(name)){
                        p.email =jr.nextString();
                    }
                }
                jr.endObject();//结束对象的解析
                list.add(p);
            }
            jr.endArray();//数组解析完毕

        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

}

生成JSON

public void createJSONClick(View view){

        ArrayList list =new ArrayList<>();
        Person p1 =new Person();
        p1.firstName="aa";
        p1.lastName="vince";
        p1.email="[email protected]";
        Person p2 =new Person();
        p2.firstName="bb";
        p2.lastName="ake";
        p2.email="[email protected]";

        list.add(p1);
        list.add(p2);


    JSONObject json =new JSONObject();
    JSONArray array =new JSONArray();

        try {
            for (int i=0;i

GSON

  //使用GSON解析JSON
    public void gsonParseJsonClick(View view){
        Gson  gson =new Gson();
        Reader r =new InputStreamReader(getResources().openRawResource(R.raw.person));
        Type type =new TypeToken>(){}.getType();
        ArrayList list = gson.fromJson(r,type);
        for (int i =0;i
//gson转换json
 public void gsonToJsonClick(View view){
        ArrayList list =new ArrayList<>();
        Person p1 =new Person();
        p1.firstName="aa";
        p1.lastName="vince";
        p1.email="[email protected]";
        Person p2 =new Person();
        p2.firstName="bb";
        p2.lastName="ake";
        p2.email="[email protected]";

        list.add(p1);
        list.add(p2);

        Gson gson =new Gson();

        Type type =new TypeToken>(){}.getType();
        String json = gson.toJson(list,type);
        System.out.println(json);
    }

你可能感兴趣的:(周记)