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,我是从那里下载的源码然后看的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值