XML和JSON其实还是比较常见了,JAVASE和JAVAEE的学习中或多或少会有些接触的,这篇文章主要关于XML和JSON在安卓中的一些应用。
XML是一种常用的存储数据方式,设计初衷就是为了传输和存储数据。
在Android平台中内部很多地方使用了XML存储:
XML主要有三种方式:
它们对应的特点如下:
parser.next()
//开始元素和结束元素事件,可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。
parser.nextTextl()
//当元素开始解析时,调用该方法可以获取下一个Text类型元素的值。
毕竟是关于安卓的文章,所以我们主要体来讲讲PULL解析这部分
可用按照下面的步骤解析XML文件
1、android给我们提供了xml用来得到xmlpull解析器
2、传入文件输入流及xml文件编码
3、pull读到xml后返回EventType,EventType有如下五种
4、获取当前EventType
5、获取下一下事件类型
while(eventType!-XmlPullParser.END DOCUMENT){
switch (eventTypel) {...}
eventType- parser.next();
}
在开始之前,先学习一下怎么写一个简单的XML文件。
偷一张图,出处http://www.w3school.com.cn/xml/xml_tree.asp
package com.example.a4_10xml;
public class Classmate {
int sno;
String name;
String sex;
int age;
@Override
public String toString() {
return "Classmate{" +
"sno=" + sno +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", grade=" + grade +
'}';
}
int grade;
}
我们把写好的xml文件放在res/raw目录下(原生目录)
对xml文件准备一个类
package com.example.a4_10xml;
public class Classmate {
int sno;
String name;
String sex;
int age;
int grade;
}
准备一个Button
package com.example.a4_10xml;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import android.widget.ArrayAdapter;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//使用PULL解析XML文件 (点击事件)
public void xmlpull(View v){
ArrayList list = parser();
for (int i=0;i parser(){
//创建ArrayList
ArrayList list = new ArrayList<>();
Classmate classmate = null;
//创建PULL解析器
XmlPullParser pullParser = Xml.newPullParser();
//StringReader stringReader = new StringReader(xml);
InputStream in = getResources().openRawResource(R.raw.test);
try {
//设置要解析的文件流
pullParser.setInput(in,"UTF-8");
//获取当前的事件类型
int eventType = pullParser.getEventType();
//不等于文档解析结束
while (eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
//开始标记
case XmlPullParser.START_TAG:
String tag = pullParser.getName();
if ("classmate".equals(tag)){
classmate = new Classmate();
classmate.sno = Integer.parseInt(pullParser.getAttributeValue(null,"sno"));
}
else if("name".equals(tag)){
classmate.name = pullParser.nextText();
}
else if("sex".equals(tag)){
classmate.sex = pullParser.nextText();
}
else if("name".equals(tag)){
classmate.age = Integer.parseInt(pullParser.nextText());
}
else if("name".equals(tag)){
classmate.grade = Integer.parseInt(pullParser.nextText());
}
break;
//结束标记
case XmlPullParser.END_TAG:
if("classmate".equals(pullParser.getName())){
//添加到list
list.add(classmate);
}
break;
}
//获取下一个事件类型,开始循环
eventType = pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
效果如下:
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
- 它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。
- JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
- 这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
JSON建构于两种结构:
JSON表示名称/值对的方式:
表示数组:
出处:http://www.w3school.com.cn/json/json_syntax.asp
JSONReader是android.util包下的一个用于解析JSON的工具类。
注意:最低版本要求是API 11。
使用方式:
JsonReader reader = new JsonReader(new StringReaderljsonDatal)
类似的准备一个json文件
{
"user":[
{"name":"中国移动","tel":10086,"Resume":"测试1"},{"name":"中国电信","tel":10000,"Resume":"测试1"}
]
}
类似的也需要准备一个对应的类,方便起见全string了....
package com.example.a4_10json;
public class Person {
String name;
String tel;
String Resume;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", tel='" + tel + '\'' +
", Resume='" + Resume + '\'' +
'}';
}
}
完整代码如下:
package com.example.a4_10json;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.JsonReader;
import android.view.View;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void json_read(View v){
ArrayList list= jsonReader();
for (int i=0;i jsonReader() {
ArrayList list=new ArrayList<>();
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.test));
JsonReader jr=new JsonReader(r);
try {
//开始解析对象
jr.beginObject();
if (jr.hasNext()) {
if ("user".equals(jr.nextName())) {
//开始解析数组
jr.beginArray();
//解析每一个对象
while (jr.hasNext()){
//开始解析对象
Person p = new Person();
jr.beginObject();
while (jr.hasNext()){
//得到属性名称
String name = jr.nextName();
if("name".equals(name)){
//得到姓名
p.name=jr.nextString();
}else if("tel".equals(name)){
//电话
p.tel=jr.nextString();
}else if("Resume".equals(name)){
//简介
p.Resume=jr.nextString();
}
}
//结束对象的解析
jr.endObject();
//添加到list
list.add(p);
}
//结束数组解析
jr.endArray();
}
}
//结束对象解析
jr.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
效果如下:
可以如图代码的思路实现
下面提供一段完整的Demo
准备一个Butoon
//使用JsonReader解析JSON数据注释往下的部分为上一个Demo的代码
package com.example.a4_10json;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.JsonReader;
import android.view.View;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//生成一组JSON数据
public void json_create(View v){
ArrayList list=new ArrayList<>();
Person p1=new Person();
p1.name="生成的数据1";
p1.tel="123";
p1.Resume="测试1";
Person p2=new Person();
p2.name="生成的数据1";
p2.tel="456";
p2.Resume="测试2";
//添加
list.add(p1);
list.add(p2);
JSONObject json=new JSONObject();
JSONArray array=new JSONArray();
try {
for (int i=0;i list= jsonReader();
for (int i=0;i jsonReader() {
ArrayList list=new ArrayList<>();
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.test));
JsonReader jr=new JsonReader(r);
try {
//开始解析对象
jr.beginObject();
if (jr.hasNext()) {
if ("user".equals(jr.nextName())) {
//开始解析数组
jr.beginArray();
//解析每一个对象
while (jr.hasNext()){
//开始解析对象
Person p = new Person();
jr.beginObject();
while (jr.hasNext()){
//得到属性名称
String name = jr.nextName();
if("name".equals(name)){
//得到姓名
p.name=jr.nextString();
}else if("tel".equals(name)){
//电话
p.tel=jr.nextString();
}else if("Resume".equals(name)){
//简介
p.Resume=jr.nextString();
}
}
//结束对象的解析
jr.endObject();
//添加到list
list.add(p);
}
//结束数组解析
jr.endArray();
}
}
//结束对象解析
jr.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
效果如下:
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
GITHUB地址:https://github.com/google/gson
使用Gson直接把JSON数据转换成Java对象
public Student parserJSON2(String data){
Gson gson = new Gson();
Student s = gson.fromJson(data, Student.class);
return s;
}
使用Gson直接把JSON数组转换成Java对象
public List Student> parserJSON3(String data){
Type type = new TypeToken>(){}.getType();
Gson gson = new Gson();
List list =gson.fromJson(data, type);
return list;
}
使用GSON前需要导入JAR包,JAR包可以在提供的GITHUB地址上下载
下载完毕后将jar包放在如下路径
然后还需要点一下Add As Library
规矩和之前差不多,不多叙述,直接放代码。
小改一下test.js的on代码 重新建个test2.json
[{"name":"中国移动","tel":10086,"Resume":"测试1"},{"name":"中国电信","tel":10000,"Resume":"测试1"}]
最终代码:
package com.example.a4_10json;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.JsonReader;
import android.view.View;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//使用GSON解析JSON
public void GSON(View v){
Gson gson=new Gson();
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.test2));
//选Reflect包下的Type
Type type=new TypeToken>(){}.getType();
ArrayList list= gson.fromJson(r,type);
for (int i=0;i list=new ArrayList<>();
Person p1=new Person();
p1.name="测试数据1";
p1.tel="123456";
p1.Resume="使用GSON生成JSON的数据1";
Person p2=new Person();
p2.name="测试数据2";
p2.tel="456789";
p2.Resume="使用GSON生成JSON的数据2";
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);
}
//生成一组JSON数据
public void json_create(View v){
ArrayList list=new ArrayList<>();
Person p1=new Person();
p1.name="生成的数据1";
p1.tel="123";
p1.Resume="测试1";
Person p2=new Person();
p2.name="生成的数据1";
p2.tel="456";
p2.Resume="测试2";
//添加
list.add(p1);
list.add(p2);
JSONObject json=new JSONObject();
JSONArray array=new JSONArray();
try {
for (int i=0;i list= jsonReader();
for (int i=0;i jsonReader() {
ArrayList list=new ArrayList<>();
Reader r=new InputStreamReader(getResources().openRawResource(R.raw.test));
JsonReader jr=new JsonReader(r);
try {
//开始解析对象
jr.beginObject();
if (jr.hasNext()) {
if ("user".equals(jr.nextName())) {
//开始解析数组
jr.beginArray();
//解析每一个对象
while (jr.hasNext()){
//开始解析对象
Person p = new Person();
jr.beginObject();
while (jr.hasNext()){
//得到属性名称
String name = jr.nextName();
if("name".equals(name)){
//得到姓名
p.name=jr.nextString();
}else if("tel".equals(name)){
//电话
p.tel=jr.nextString();
}else if("Resume".equals(name)){
//简介
p.Resume=jr.nextString();
}
}
//结束对象的解析
jr.endObject();
//添加到list
list.add(p);
}
//结束数组解析
jr.endArray();
}
}
//结束对象解析
jr.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
效果如下:
解析
生成
从以下6点比较JSON与XML :