json生成与解析实例
2015-02-02 20:20
357 查看
重点类:JsonWriter,JsonRead,JSONObject,JSONTokener,JSONArray.
![](http://img.blog.csdn.net/20150202202426717?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
流程:
1. 首先在MainActivity.java类中的四个按钮对应的是
![](http://img.blog.csdn.net/20150202202701938?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
前面两个是利用JsonParserUtil.java这个类来生成或者解析json数据
后面两个是利用JsonParserUtil2.java这个类来生成或者解析json数据;
2 .
2. 1) 在初始化时,会准备数据,就是首先先要通过XmlPullParserUtil.java类来读取cd_catalog.xml文件中准备的数据,解析出的数据全部保存在ArrayList<CDEntity> cds;这个对象中;
2. 2) 接着如果点击第一个按钮,利用输出流将调用JsonParserUtil.java类的生成的json数据写入到文件中,
2.2.1)JsonWriter write= new JsonWriter(new OutputStreamWriter(out));第一种生成方式是通过传入一个输出流对象通过JsonWriter类来生成,这个JsonWriter是安卓对象,不是自定义的。
下面这段代码只是为了展示生成的json数据
![](http://img.blog.csdn.net/20150202202854508?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图片1
所以你会看到在底部有一个textview用于展示生成或者解析出的json数据。
2.3)如果点击第二个按钮就是解析保存在SD卡上的数据,成为json数据。
FileInputStream in = new FileInputStream(file);
cds =JsonParserUtil.ReadJson(in);
从file中得到的数据全部保存在了ArrayList<CDEntity>cds;这个对象中;
并且跳转到CDListActivity.java类中展示。
2.3.1)JsonReader read =new JsonReader(new InputStreamReader(in));要想解析file数据第一种方法是通过JsonReader类
2.4)如果点击第三个按钮就是通过第二种方法来将json数据写入到file中,
2.4.1)第二种方法主要是利用了JSONArray这个类,返回值是一个String对象,这个对象里保存着json数据。
2.5)如果点击第四个按钮,就是用第二种方式将file中的json数据解析出来,并且跳转到CDListActivity.java类中展示
2.5.1) 第二种解析file中数据成为json数据的方式是:利用一个JSONTokener的类,这个类是一个输入流;
然后利用JSONArray这个类,这是一个数组,用来存放解析出的数据,
然后通过JSONObject这个类来将得到的数据填充进CDEntity这个类中
最后将CDEntity这个类中的数据保存在ArrayList中。
3. 关于StreamUtil.java这个类有下面几个作用
3.1)从文件中读取数据变为String类型
这变为String类型程序中有两种作用:
第一种就是当将json数据写入到file文件中后,图片1处底部用于展示生成的json数据;
第二种就是上面代码看到的,解析file文件内容时,第二种解析方式需要传入一个String类型,而这个类正好可以把file中的内容变为String类型,然后传入给JsonParserUtil2.java这个类来解析。
代码:
MainActivity.java
CDListActivity.java(用于展示解析出json内容的ListActivity类)
JsonParserUtil.java(json解析生成的第一种方法)
JsonParserUtil2.java(json解析或者生成的第二种方法)
CDEntity.java(实体类,用于保存要展示在ListActivity类中的内容)
一般是要解析json内容时,然后暂时保存在这里面
XmlPullParserUtil.java(用来解析XML文件内容的工具类)
StreamUtil.java(将生成的文件内容读取或者是将要生成的东西写入文件中)
cd_catalog.xml(这里是准备的数据)
首先先要解析此XML文件的数据,然后生成json 数据,所以准备了一个XmlPullParserUtil.java类来解析这里面的数据。
结果:
1.点击通过JsonWriter写入json或者是通过 JSONObject写入json
![](http://img.blog.csdn.net/20150202203716189?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.点击通过JsonRead读取json或者通过JSONTokener读取json
![](http://img.blog.csdn.net/20150202203745204?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3.点击上面菜单的具体条目时:
![](http://img.blog.csdn.net/20150202203830414?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHcxODc1MTgzNjY3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
部分代码解析与注意:
这个类是一个ListActivity类,就是相当于ListView。
所以在这里可以setAdapter。
这里是ListView设置点击具体条目跳出一个对话框然后对话框中会显示具体信息。就是结果的第三个界面。
PS:以上代码来源于DevStore,我是从那里下载的源码然后看的
流程:
1. 首先在MainActivity.java类中的四个按钮对应的是
前面两个是利用JsonParserUtil.java这个类来生成或者解析json数据
后面两个是利用JsonParserUtil2.java这个类来生成或者解析json数据;
2 .
2. 1) 在初始化时,会准备数据,就是首先先要通过XmlPullParserUtil.java类来读取cd_catalog.xml文件中准备的数据,解析出的数据全部保存在ArrayList<CDEntity> cds;这个对象中;
2. 2) 接着如果点击第一个按钮,利用输出流将调用JsonParserUtil.java类的生成的json数据写入到文件中,
FileOutputStream fout = new FileOutputStream(file); JsonParserUtil.WriteJson(cds,fout); //将ArrayList中的内容写到json文件中 fout.close();
2.2.1)JsonWriter write= new JsonWriter(new OutputStreamWriter(out));第一种生成方式是通过传入一个输出流对象通过JsonWriter类来生成,这个JsonWriter是安卓对象,不是自定义的。
下面这段代码只是为了展示生成的json数据
FileInputStream in = new FileInputStream(file); String str = StreamUtil.getString(in); //将json文件中的内容转为字符串 tv.setText(str);
图片1
所以你会看到在底部有一个textview用于展示生成或者解析出的json数据。
2.3)如果点击第二个按钮就是解析保存在SD卡上的数据,成为json数据。
FileInputStream in = new FileInputStream(file);
cds =JsonParserUtil.ReadJson(in);
从file中得到的数据全部保存在了ArrayList<CDEntity>cds;这个对象中;
并且跳转到CDListActivity.java类中展示。
2.3.1)JsonReader read =new JsonReader(new InputStreamReader(in));要想解析file数据第一种方法是通过JsonReader类
2.4)如果点击第三个按钮就是通过第二种方法来将json数据写入到file中,
2.4.1)第二种方法主要是利用了JSONArray这个类,返回值是一个String对象,这个对象里保存着json数据。
String str = null; //构建jsonArray对象,用来存储数组 JSONArray jArray = new JSONArray(); //用来存放解析出来的entity对象 JSONObject jo = null; //遍历ArrayList,将每一个entity对象生成jsonObject对象 for(CDEntity entity:cds){ jo = new JSONObject(); jo.put("title", entity.getTitle()); jo.put("artist", entity.getArtist()); jo.put("company", entity.getCompany()); jo.put("country", entity.getCountry()); jo.put("price", entity.getPrice()); jo.put("year", entity.getYear()); //将解析出来的jsonObject对象添加到jsonArray数组中 jArray.put(jo); } str = jArray.toString(); //生成json格式字符串 return str;
2.5)如果点击第四个按钮,就是用第二种方式将file中的json数据解析出来,并且跳转到CDListActivity.java类中展示
2.5.1) 第二种解析file中数据成为json数据的方式是:利用一个JSONTokener的类,这个类是一个输入流;
然后利用JSONArray这个类,这是一个数组,用来存放解析出的数据,
然后通过JSONObject这个类来将得到的数据填充进CDEntity这个类中
最后将CDEntity这个类中的数据保存在ArrayList中。
//获取json解析器对象 JSONTokener tokener = new JSONTokener(in); //通过nextValue可以读取整个对象或者一部分对象(从当前位置开始以后的第一个完整对象或完整文本) JSONArray jArray = (JSONArray) tokener.nextValue(); CDEntity entity = null; //循环遍历数组对象,获取每一个json对象进行解析 for(int i = 0;i<jArray.length();i++){ JSONObject jo = (JSONObject) jArray.get(i); entity = new CDEntity(); //将json对应的key的值取出来,设置为cdentity的属性 entity.setTitle(jo.getString("title")); entity.setArtist(jo.getString("artist")); entity.setCompany(jo.getString("company")); entity.setCountry(jo.getString("country")); entity.setPrice(Float.parseFloat(jo.getString("price"))); entity.setYear(jo.getInt("year")); //解析完成,将entity添加到list中 cds.add(entity); } return cds;
3. 关于StreamUtil.java这个类有下面几个作用
3.1)从文件中读取数据变为String类型
//从文件中读取输入流 FileInputStream in = new FileInputStream(file); String str = StreamUtil.getString(in); cds = JsonParserUtil2.readJson(str);
这变为String类型程序中有两种作用:
第一种就是当将json数据写入到file文件中后,图片1处底部用于展示生成的json数据;
第二种就是上面代码看到的,解析file文件内容时,第二种解析方式需要传入一个String类型,而这个类正好可以把file中的内容变为String类型,然后传入给JsonParserUtil2.java这个类来解析。
代码:
MainActivity.java
package com.example.json_parser;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.json.JSONException;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
ArrayList<CDEntity> cds;
private Button btn1;
private Button btn2;
private Button btn3;
private Button btn4;
private TextView tv;
//将解析后的json文件保存到sdcard中,注意操作sdcard需要权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
File file = new File(Environment.getExternalStorageDirectory()+File.separator+"cdjson.json");
private void initView(){
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn3 = (Button)findViewById(R.id.button3);
btn4 = (Button)findViewById(R.id.button4);
tv = (TextView)findViewById(R.id.textView1);
tv.setMovementMethod(new ScrollingMovementMethod()); //Textview中显示的内容较多,需要滚动才能显示完全。
//生成json文件的按钮
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream fout = new FileOutputStream(file);
JsonParserUtil.WriteJson(cds,fout); //将ArrayList中的内容写到json文件中
fout.close();
FileInputStream in = new FileInputStream(file); String str = StreamUtil.getString(in); //将json文件中的内容转为字符串 tv.setText(str);Toast.makeText(MainActivity.this, "json文件生成完毕", 0).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//解析json文件的按钮
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try{
cds = null;
if(!file.exists()){
Toast.makeText(MainActivity.this, "json文件还未生成", 0).show();
return;
}
FileInputStream in = new FileInputStream(file);
cds = JsonParserUtil.ReadJson(in);
Toast.makeText(MainActivity.this, "json解析成功", 0).show();
}catch(Exception e){
e.printStackTrace();
}
Intent intent = new Intent(MainActivity.this,CDListActivity.class);
intent.putExtra("cds", cds);
startActivity(intent);
}
});
//生成json文件的按钮 用第二种解析器
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
//此处返回的是一长串的json字符串
//[{"year":1985,"title":"Empire Burlesque","price":10.899999618530273,"artist":"Bob Dylan","country":"USA","company":"Columbia"},
//{"year":1988,"title":"Hide your heart","price":9.899999618530273,"artist":"Bonnie Tyler","country":"UK","company":"CBS Records"},.....
//{"year":1987,"title":"Unchain my heart","price":8.199999809265137,"artist":"Joe Cocker","country":"USA","company":"EMI"}]
//就是这种形式的一串串
String str = JsonParserUtil2.writeJson(cds);
FileOutputStream out = new FileOutputStream(file);
ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes());
StreamUtil.getInputStream(in, out);
in.close();
out.close();
tv.setText(str);
Toast.makeText(MainActivity.this, "json文件生成完毕", 0).show();
} catch (JSONException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
btn4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
cds = null;
if(!file.exists()){
Toast.makeText(MainActivity.this, "json文件还未生成", 0).show();
return;
}
try {
//从文件中读取输入流
FileInputStream in = new FileInputStream(file);
String str = StreamUtil.getString(in);
cds = JsonParserUtil2.readJson(str);
Toast.makeText(MainActivity.this, "json读取成功", 0).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
Intent intent = new Intent(MainActivity.this,CDListActivity.class);
intent.putExtra("cds", cds);
startActivity(intent);
}
});
}
private void init(){
InputStream in;
try {
//通过解析xml文件获取初始数据
in = getAssets().open("cd_catalog.xml");
cds = XmlPullParserUtil.pullParser(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
initView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
CDListActivity.java(用于展示解析出json内容的ListActivity类)
package com.example.json_parser; import java.util.ArrayList; import android.app.AlertDialog; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.TextView; /**用来展现专辑信息列表*/ public class CDListActivity extends ListActivity { private ArrayList<CDEntity> cds; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); cds = (ArrayList<CDEntity>) getIntent().getExtras().get("cds"); setListAdapter(new ArrayAdapter<CDEntity>(CDListActivity.this,android.R.layout.simple_list_item_1,cds)); getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { View v = getLayoutInflater().inflate(R.layout.dialog_info, null); CDEntity entity = cds.get(position); ((TextView)v.findViewById(R.id.textView1)).setText("专辑标题:"+entity.getTitle()); ((TextView)v.findViewById(R.id.textView2)).setText("专辑歌手:"+entity.getArtist()); ((TextView)v.findViewById(R.id.textView3)).setText("专辑国家:"+entity.getCountry()); ((TextView)v.findViewById(R.id.textView4)).setText("所属公司:"+entity.getCompany()); ((TextView)v.findViewById(R.id.textView5)).setText("价格:"+entity.getPrice()); ((TextView)v.findViewById(R.id.textView6)).setText("发布年份:"+entity.getYear()); new AlertDialog.Builder(CDListActivity.this).setTitle("专辑信息").setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton("确定", null).setView(v).create().show(); } }); } }
JsonParserUtil.java(json解析生成的第一种方法)
package com.example.json_parser; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import android.util.JsonReader; import android.util.JsonWriter; /**用来演示android对json数据的读写操作 * 使用jsonWriter和JsonReader实现json文件的读写(需要android sdk 11及以上才可以使用) * */ public class JsonParserUtil { /**将CDEntity对象写入Json流. * @throws IOException */ private static void getJsonObject(CDEntity entity,JsonWriter write) throws IOException{ //数组对象开始写入前先执行beginObject()方法 write.beginObject(); //以变量名为Key,变量值为value将对象中的属性写入json输出流 write.name("title").value(entity.getTitle()); write.name("artist").value(entity.getArtist()); write.name("country").value(entity.getCountry()); write.name("company").value(entity.getCompany()); write.name("price").value(entity.getPrice()); write.name("year").value(entity.getYear()); //数组对象写入结束需要执行endObject()方法 write.endObject(); } /**将ArrayList对象写入OutputStream对象 该方法需Sdk11以上可用 * @throws IOException */ public static void WriteJson(ArrayList<CDEntity> cds,OutputStream out) throws IOException{ //通过传入的输出流生成Json字符输出流对象 JsonWriter write = new JsonWriter(new OutputStreamWriter(out)); //写入数组前需要执行beginArray()方法 write.beginArray(); //遍历List,将其中的每一个元素写入输出流 for(CDEntity entity : cds){ getJsonObject(entity,write); } //写入数组完成需要执行endArray()方法 write.endArray(); //执行完所有写入操作需要关闭输入流。 write.close(); } /**将Json数组解析为ArrayList对象 该方法需Sdk11以上可用 * @throws IOException */ public static ArrayList<CDEntity> ReadJson(InputStream in) throws IOException{ ArrayList<CDEntity> cds = new ArrayList<CDEntity>(); //构建json输入流对象 JsonReader read = new JsonReader(new InputStreamReader(in)); //读取数组前需要执行beginArray方法 read.beginArray(); while(read.hasNext()){ //循环读取输入流,并将其加入到ArrayList中,直到输入流中没有数据 cds.add(ReadEntity(read)); } read.endArray(); return cds; } /**将Json输入流解析为CDEntity对象 * @throws IOException */ private static CDEntity ReadEntity(JsonReader read) throws IOException{ CDEntity entity = null; read.beginObject(); entity = new CDEntity(); while(read.hasNext()){ String key = read.nextName(); if("title".equals(key)){ entity.setTitle(read.nextString()); }else if("artist".equals(key)){ entity.setArtist(read.nextString()); }else if("country".equals(key)){ entity.setCountry(read.nextString()); }else if("company".equals(key)){ entity.setCompany(read.nextString()); }else if("price".equals(key)){ entity.setPrice(Float.parseFloat(read.nextString())); }else if("year".equals(key)){ entity.setYear(Integer.parseInt(read.nextString())); }else{ read.skipValue(); //忽略其他key对应的值 } } read.endObject(); return entity; } }
JsonParserUtil2.java(json解析或者生成的第二种方法)
package com.example.json_parser;
import java.io.InputStream;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
/**使用JSONObject,JSONArray等来构建json对象。要求android sdk 版本在2.3以上*/
public class JsonParserUtil2 {
/**将json格式的字符串解析*/
public static ArrayList<CDEntity> readJson(String in) throws JSONException{
ArrayList<CDEntity> cds = new ArrayList<CDEntity>();
//获取json解析器对象 JSONTokener tokener = new JSONTokener(in); //通过nextValue可以读取整个对象或者一部分对象(从当前位置开始以后的第一个完整对象或完整文本) JSONArray jArray = (JSONArray) tokener.nextValue(); CDEntity entity = null; //循环遍历数组对象,获取每一个json对象进行解析 for(int i = 0;i<jArray.length();i++){ JSONObject jo = (JSONObject) jArray.get(i); entity = new CDEntity(); //将json对应的key的值取出来,设置为cdentity的属性 entity.setTitle(jo.getString("title")); entity.setArtist(jo.getString("artist")); entity.setCompany(jo.getString("company")); entity.setCountry(jo.getString("country")); entity.setPrice(Float.parseFloat(jo.getString("price"))); entity.setYear(jo.getInt("year")); //解析完成,将entity添加到list中 cds.add(entity); } return cds;}
/**将ArrayList中的内容写入json对象中
* @throws JSONException */
public static String writeJson(ArrayList<CDEntity> cds) throws JSONException{
String str = null; //构建jsonArray对象,用来存储数组 JSONArray jArray = new JSONArray(); //用来存放解析出来的entity对象 JSONObject jo = null; //遍历ArrayList,将每一个entity对象生成jsonObject对象 for(CDEntity entity:cds){ jo = new JSONObject(); jo.put("title", entity.getTitle()); jo.put("artist", entity.getArtist()); jo.put("company", entity.getCompany()); jo.put("country", entity.getCountry()); jo.put("price", entity.getPrice()); jo.put("year", entity.getYear()); //将解析出来的jsonObject对象添加到jsonArray数组中 jArray.put(jo); } str = jArray.toString(); //生成json格式字符串 return str;}
}
CDEntity.java(实体类,用于保存要展示在ListActivity类中的内容)
一般是要解析json内容时,然后暂时保存在这里面
package com.example.json_parser; import java.io.Serializable; /**代表专辑的实体类,在进行xml解析时用来封装数据*/ public class CDEntity implements Serializable{ /** * */ private static final long serialVersionUID = 1692431541356358640L; /**专辑标题*/ private String title; /**专辑歌手*/ private String artist; /**专辑国家*/ private String country; /**唱片公司*/ private String company; /**价格*/ private float price; /**年份*/ private int year; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getArtist() { return artist; } public void setArtist(String artist) { this.artist = artist; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public CDEntity() { super(); } public CDEntity(String title, String artist, String country, String company, float price, int year) { super(); this.title = title; this.artist = artist; this.country = country; this.company = company; this.price = price; this.year = year; } @Override public String toString() { return "CD名字:"+title; } }
XmlPullParserUtil.java(用来解析XML文件内容的工具类)
package com.example.json_parser; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; /**android内置了pull解析,相对dom解析来说pull更省内存.*/ public class XmlPullParserUtil { public static ArrayList<CDEntity> pullParser(InputStream in){ ArrayList<CDEntity> cds = null; try { //构建pull解析工厂 XmlPullParserFactory factory; factory = XmlPullParserFactory.newInstance(); //构建pull解析器对象 XmlPullParser parser = factory.newPullParser(); //设置解析器的数据源 parser.setInput(new InputStreamReader(in)); //获取事件,开始进行解析 int eventType = parser.getEventType(); //将要生成的CD对象 CDEntity entity = null; //循环遍历xml文档,直到遍历到文档末尾 while(eventType != XmlPullParser.END_DOCUMENT){ switch(eventType){ //在xml文档开始的时候构建ArrayList对象。 case XmlPullParser.START_DOCUMENT: cds = new ArrayList<CDEntity>(); break; //在标签开始时对标签名进行判断 case XmlPullParser.START_TAG: String name = parser.getName(); //标签名为CD时,构建CD对象 if("CD".equals(name)){ entity = new CDEntity(); //如果标签为title,则cd肯定不为空,且获取到的文本为cd标题,则将cd的标题属性设置为title标签的文本 }else if("TITLE".equals(name)){ entity.setTitle(parser.nextText()); }else if("ARTIST".equals(name)){ entity.setArtist(parser.nextText()); }else if("COUNTRY".equals(name)){ entity.setCountry(parser.nextText()); }else if("COMPANY".equals(name)){ entity.setCompany(parser.nextText()); }else if("PRICE".equals(name)){ entity.setPrice(Float.parseFloat(parser.nextText())); }else if("YEAR".equals(name)){ entity.setYear(Integer.parseInt(parser.nextText())); } break; //标签结束后,判断结束标签是什么。如果cd标签结束,则生成cd对象完成,应该将其添加到ArrayList中 case XmlPullParser.END_TAG: if("CD".equals(parser.getName())){ cds.add(entity); } break; } //循环处理结束后,需要将标签设置为下一个标签,避免无限循环 eventType = parser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(cds); return cds; } }
StreamUtil.java(将生成的文件内容读取或者是将要生成的东西写入文件中)
package com.example.json_parser; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /**与流处理相关的工具类*/ public class StreamUtil { /**将给定输入流中的内容转移到给定输出流 * @throws IOException */ public static void getInputStream(InputStream in,OutputStream out) throws IOException{ if(in == null || out == null){ return; } //定义缓冲区 byte[] buf = new byte[1024]; int len = -1; while((len = in.read(buf)) != -1){ //循环读取出入流中的内容,并写入输出流,直到输入流末尾 out.write(buf,0,len); } out.flush(); } /**将输入流中的内容生成字符串 * @throws IOException */ public static String getString(InputStream in) throws IOException{ String str = null; ByteArrayOutputStream out = new ByteArrayOutputStream(); getInputStream(in, out); str = new String(out.toByteArray()); in.close(); return str; } }
cd_catalog.xml(这里是准备的数据)
首先先要解析此XML文件的数据,然后生成json 数据,所以准备了一个XmlPullParserUtil.java类来解析这里面的数据。
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Edited with XML Spy v2007 (http://www.altova.com) --> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tyler</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS Records</COMPANY> <PRICE>9.90</PRICE> <YEAR>1988</YEAR> </CD> <CD> <TITLE>Greatest Hits</TITLE> <ARTIST>Dolly Parton</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>RCA</COMPANY> <PRICE>9.90</PRICE> <YEAR>1982</YEAR> </CD> <CD> <TITLE>Still got the blues</TITLE> <ARTIST>Gary Moore</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Virgin records</COMPANY> <PRICE>10.20</PRICE> <YEAR>1990</YEAR> </CD> <CD> <TITLE>Eros</TITLE> <ARTIST>Eros Ramazzotti</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>BMG</COMPANY> <PRICE>9.90</PRICE> <YEAR>1997</YEAR> </CD> <CD> <TITLE>One night only</TITLE> <ARTIST>Bee Gees</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Polydor</COMPANY> <PRICE>10.90</PRICE> <YEAR>1998</YEAR> </CD> <CD> <TITLE>Sylvias Mother</TITLE> <ARTIST>Dr.Hook</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS</COMPANY> <PRICE>8.10</PRICE> <YEAR>1973</YEAR> </CD> <CD> <TITLE>Maggie May</TITLE> <ARTIST>Rod Stewart</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Pickwick</COMPANY> <PRICE>8.50</PRICE> <YEAR>1990</YEAR> </CD> <CD> <TITLE>Romanza</TITLE> <ARTIST>Andrea Bocelli</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>Polydor</COMPANY> <PRICE>10.80</PRICE> <YEAR>1996</YEAR> </CD> <CD> <TITLE>When a man loves a woman</TITLE> <ARTIST>Percy Sledge</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Atlantic</COMPANY> <PRICE>8.70</PRICE> <YEAR>1987</YEAR> </CD> <CD> <TITLE>Black angel</TITLE> <ARTIST>Savage Rose</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>Mega</COMPANY> <PRICE>10.90</PRICE> <YEAR>1995</YEAR> </CD> <CD> <TITLE>1999 Grammy Nominees</TITLE> <ARTIST>Many</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Grammy</COMPANY> <PRICE>10.20</PRICE> <YEAR>1999</YEAR> </CD> <CD> <TITLE>For the good times</TITLE> <ARTIST>Kenny Rogers</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Mucik Master</COMPANY> <PRICE>8.70</PRICE> <YEAR>1995</YEAR> </CD> <CD> <TITLE>Big Willie style</TITLE> <ARTIST>Will Smith</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>9.90</PRICE> <YEAR>1997</YEAR> </CD> <CD> <TITLE>Tupelo Honey</TITLE> <ARTIST>Van Morrison</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Polydor</COMPANY> <PRICE>8.20</PRICE> <YEAR>1971</YEAR> </CD> <CD> <TITLE>The very best of</TITLE> <ARTIST>Cat Stevens</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Island</COMPANY> <PRICE>8.90</PRICE> <YEAR>1990</YEAR> </CD> <CD> <TITLE>Stop</TITLE> <ARTIST>Sam Brown</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>A and M</COMPANY> <PRICE>8.90</PRICE> <YEAR>1988</YEAR> </CD> <CD> <TITLE>Bridge of Spies</TITLE> <ARTIST>T'Pau</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Siren</COMPANY> <PRICE>7.90</PRICE> <YEAR>1987</YEAR> </CD> <CD> <TITLE>Private Dancer</TITLE> <ARTIST>Tina Turner</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>Capitol</COMPANY> <PRICE>8.90</PRICE> <YEAR>1983</YEAR> </CD> <CD> <TITLE>Midt om natten</TITLE> <ARTIST>Kim Larsen</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>Medley</COMPANY> <PRICE>7.80</PRICE> <YEAR>1983</YEAR> </CD> <CD> <TITLE>Pavarotti Gala Concert</TITLE> <ARTIST>Luciano Pavarotti</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>DECCA</COMPANY> <PRICE>9.90</PRICE> <YEAR>1991</YEAR> </CD> <CD> <TITLE>The dock of the bay</TITLE> <ARTIST>Otis Redding</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Atlantic</COMPANY> <PRICE>7.90</PRICE> <YEAR>1987</YEAR> </CD> <CD> <TITLE>Picture book</TITLE> <ARTIST>Simply Red</ARTIST> <COUNTRY>EU</COUNTRY> <COMPANY>Elektra</COMPANY> <PRICE>7.20</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Red</TITLE> <ARTIST>The Communards</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>London</COMPANY> <PRICE>7.80</PRICE> <YEAR>1987</YEAR> </CD> <CD> <TITLE>Unchain my heart</TITLE> <ARTIST>Joe Cocker</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>EMI</COMPANY> <PRICE>8.20</PRICE> <YEAR>1987</YEAR> </CD> </CATALOG>
结果:
1.点击通过JsonWriter写入json或者是通过 JSONObject写入json
2.点击通过JsonRead读取json或者通过JSONTokener读取json
3.点击上面菜单的具体条目时:
部分代码解析与注意:
CDListActivity extends ListActivity
这个类是一个ListActivity类,就是相当于ListView。
setListAdapter(new ArrayAdapter<CDEntity>(CDListActivity.this,android.R.layout.simple_list_item_1,cds));
所以在这里可以setAdapter。
getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { View v = getLayoutInflater().inflate(R.layout.dialog_info, null); CDEntity entity = cds.get(position); ((TextView)v.findViewById(R.id.textView1)).setText("专辑标题:"+entity.getTitle()); ((TextView)v.findViewById(R.id.textView2)).setText("专辑歌手:"+entity.getArtist()); ((TextView)v.findViewById(R.id.textView3)).setText("专辑国家:"+entity.getCountry()); ((TextView)v.findViewById(R.id.textView4)).setText("所属公司:"+entity.getCompany()); ((TextView)v.findViewById(R.id.textView5)).setText("价格:"+entity.getPrice()); ((TextView)v.findViewById(R.id.textView6)).setText("发布年份:"+entity.getYear()); new AlertDialog.Builder(CDListActivity.this).setTitle("专辑信息").setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton("确定", null).setView(v).create().show(); } });
这里是ListView设置点击具体条目跳出一个对话框然后对话框中会显示具体信息。就是结果的第三个界面。
PS:以上代码来源于DevStore,我是从那里下载的源码然后看的
相关文章推荐
- Android Json生成及解析实例
- boost生成和解析json实例及定向到文件
- Android Json生成及解析实例
- Android-Json简单解析与生成实例(一)
- Json 生成与解析详解及实例代码
- Json 生成与解析详解及实例代码
- 实例教程四:采用Pull解析器解析和生成XML内容
- 如何使用JSON Framework库解析与生成json数据
- 前台如何解析json格式 以及后台如何生成json格式
- Google Gson解析Json数据应用实例
- Json解析实例Tomcat服务器
- JS解析JSON生成界面2
- 如何使用JSON Framework库解析与生成json数据
- PHP json_decode函数无法解析json2.js生成json的问题
- PHP解析Gson生成的Json数组
- asp.net和Jquery中详细解析json数据格式!(有实例)
- [Android实例] Android JSON解析示例代码
- 一个JSON 实例: jQuery 解析JSON数据
- 实例详解PHP serialize与JSON解析
- java 超简单 生成json与解析