1. 程式人生 > >json生成與解析例項

json生成與解析例項

重點類:JsonWriter,JsonRead,JSONObject,JSONTokener,JSONArray.


流程:

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.javajson解析生成的第一種方法)

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,我是從那裡下載的原始碼然後看的