转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38259139
/**
* Json中JSONObject、JSONArray、JSONStringer和JSONTokener的使用实例
* @author AndroidLeaf
*
*/
public class JsonTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
JsonTest mJsonTest = new JsonTest();
//mJsonTest.jsonObjectTest();
//mJsonTest.jsonArrayTest();
//mJsonTest.jsonStringTest();
mJsonTest.jsonTokenerTest();
}
/**
* JsonObject对象的使用
*/
public void jsonObjectTest(){
Person mPerson = testDataPerson();
/**
* 将Person对象转换成Json字符串
*/
JSONObject mJsonObject = new JSONObject();
try {
//添加值到mJsonObject对象中
mJsonObject.put("id", mPerson.getId());
mJsonObject.put("userName", mPerson.getUserName());
mJsonObject.put("password", mPerson.getPassword());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(mJsonObject.toString());
/**打印的内容为:{"id":1,"userName":"AndroidLeaf","password":"123"} */
/**
* 将Json字符串转换成对应的Person对象
*/
Person mPerson2 = new Person();
JSONObject mJsonObject2;
try {
mJsonObject2 = new JSONObject(mJsonObject.toString());
mPerson2.setId(mJsonObject2.getInt("id"));
mPerson2.setUserName(mJsonObject2.getString("userName"));
mPerson2.setPassword(mJsonObject2.getString("password"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(mPerson2.toString());
/**打印的内容为:Person [id=1, userName=AndroidLeaf, password=123]*/
}
/**
* JsonArray对象的使用
*/
public void jsonArrayTest(){
ArrayList mList = testDataPersons();
/**
* 将Person集合对象转换成Json字符串
*/
JSONArray mJsonArray = new JSONArray();
for(int i = 0; i < mList.size();i++){
Person mPerson = mList.get(i);
try{
JSONObject mJsonObject = new JSONObject();
mJsonObject.put("id", mPerson.getId());
mJsonObject.put("userName", mPerson.getUserName());
mJsonObject.put("password", mPerson.getPassword());
mJsonArray.put(mJsonObject);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(mJsonArray.toString());
/**打印的内容为:[{"id":0,"userName":"AndroidLeaf 0","password":"1230"},
* {"id":1,"userName":"AndroidLeaf 1","password":"1231"},
* {"id":2,"userName":"AndroidLeaf 2","password":"1232"},
* {"id":3,"userName":"AndroidLeaf 3","password":"1233"},
* {"id":4,"userName":"AndroidLeaf 4","password":"1234"}]*/
/**
* 将Json字符串转换成Person集合对象
*/
ArrayList mPersons = new ArrayList();
JSONArray mJsonArray2;
try {
mJsonArray2 = new JSONArray(mJsonArray.toString());
for(int j = 0;j < mJsonArray2.length();j++){
Person mPerson = new Person();
JSONObject mJsonObject = mJsonArray2.getJSONObject(j);
mPerson.setId(mJsonObject.getInt("id"));
mPerson.setUserName(mJsonObject.getString("userName"));
mPerson.setPassword(mJsonObject.getString("password"));
mPersons.add(mPerson);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(mPersons.toString());
/**打印的内容为:
* [Person [id=0, userName=AndroidLeaf 0, password=1230],
* Person [id=1, userName=AndroidLeaf 1, password=1231],
* Person [id=2, userName=AndroidLeaf 2, password=1232],
* Person [id=3, userName=AndroidLeaf 3, password=1233],
* Person [id=4, userName=AndroidLeaf 4, password=1234]]*/
}
/**
* JsonString对象的使用
*/
public String jsonStringTest(){
/**
* 将Person对象构建成Json字符串文本
*/
JSONStringer mJsonStringer = new JSONStringer();
Person mPerson = testDataPerson();
try {
//object()和endObject()配对出现,用于描述对象开始解析
mJsonStringer.object();
mJsonStringer.key("id");
mJsonStringer.value(mPerson.getId());
mJsonStringer.key("userName");
mJsonStringer.value(mPerson.getUserName());
mJsonStringer.key("password");
mJsonStringer.value(mPerson.getPassword());
mJsonStringer.endObject();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(mJsonStringer.toString());
/**打印的内容为: {"id":1,"userName":"AndroidLeaf","password":"123"}*/
/**
* 将Person集合对象构建成Json字符串文本
*
*/
JSONStringer mJsonStringer2 = new JSONStringer();
ArrayList mList = testDataPersons();
try {
//array()和endArray()方法配对出现,用于描述数组对象开始解析
mJsonStringer2.array();
for(int i = 0 ;i < mList.size();i++){
//将Person对象解析成Json字符串并包装成JSONStringer添加到数组集合中
JSONStringer mJsonStringer3 = new JSONStringer();
mJsonStringer3.object();
mJsonStringer3.key("id");
mJsonStringer3.value(mList.get(i).getId());
mJsonStringer3.key("userName");
mJsonStringer3.value(mList.get(i).getUserName());
mJsonStringer3.key("password");
mJsonStringer3.value(mList.get(i).getPassword());
mJsonStringer3.endObject();
mJsonStringer2.value(mJsonStringer3);
}
mJsonStringer2.endArray();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(mJsonStringer2.toString());
return mJsonStringer2.toString();
/**打印的内容为:["{\"id\":0,\"userName\":\"AndroidLeaf 0\",\"password\":\"1230\"}",
* "{\"id\":1,\"userName\":\"AndroidLeaf 1\",\"password\":\"1231\"}",
* "{\"id\":2,\"userName\":\"AndroidLeaf 2\",\"password\":\"1232\"}",
* "{\"id\":3,\"userName\":\"AndroidLeaf 3\",\"password\":\"1233\"}",
* "{\"id\":4,\"userName\":\"AndroidLeaf 4\",\"password\":\"1234\"}"]*/
}
/**
* JsonTokener对象的使用
*/
public void jsonTokenerTest(){
/**jsonStr的内容为:["{\"id\":0,\"userName\":\"AndroidLeaf 0\",\"password\":\"1230\"}",
* "{\"id\":1,\"userName\":\"AndroidLeaf 1\",\"password\":\"1231\"}",
* "{\"id\":2,\"userName\":\"AndroidLeaf 2\",\"password\":\"1232\"}",
* "{\"id\":3,\"userName\":\"AndroidLeaf 3\",\"password\":\"1233\"}",
* "{\"id\":4,\"userName\":\"AndroidLeaf 4\",\"password\":\"1234\"}"]*/
String jsonStr = initTokenerData();
JSONTokener mJsonTokener = new JSONTokener(jsonStr);
try {
//跳转并读取到下一个字符
System.out.println(mJsonTokener.next());
//跳转并读取一个值
System.out.println(mJsonTokener.nextValue());
System.out.println(mJsonTokener.next());
System.out.println(mJsonTokener.nextValue());
//返回到上一个字符
mJsonTokener.back();
System.out.println(mJsonTokener.next());
//跳转到下一个包含"f"字符的位置,并获取起初位置到跳转后位置之间的字符串
System.out.println(mJsonTokener.nextTo('f'));
//mJsonTokener.next(c);
//mJsonTokener.next(arg0);
//mJsonTokener.skipTo(arg0);
//mJsonTokener.nextClean();
/**打印的内容为:[
* {"id":0,"userName":"AndroidLeaf 0","password":"1230"}
* ,
* {"id":1,"userName":"AndroidLeaf 1","password":"1231"}
* "
* ,"{\"id\":2,\"userName\":\"AndroidLea*/
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Person testDataPerson(){
Person mPerson = new Person();
mPerson.setId(1);
mPerson.setUserName("AndroidLeaf");
mPerson.setPassword("123");
return mPerson;
}
public ArrayList testDataPersons(){
ArrayList mList = new ArrayList();
for(int i = 0; i < 5; i++){
Person mPerson = new Person();
mPerson.setId(i);
mPerson.setUserName("AndroidLeaf " + i);
mPerson.setPassword("123" + i);
mList.add(mPerson);
}
return mList;
}
public String initTokenerData(){
return jsonStringTest();
}
}
基本上了解了Json的概念以及Json所提供的几个关键类的作用和使用方法后,接下来我们来正式学习如何在Android中使用Json来解析从服务端传送过来的Json数据,我们将通过一个具体的示例来深入学习一下。先整理一下示例的思路:我们创建一个Java服务端工程和Android客户端工程,然后在服务端将Java对象数据转换成Json字符串,接着Android客户端通过网络通信从服务端获取Json字符串数据,然后将Json数据使用Json数据解析方式解析成对应的Java对象,最后使用Listview列表展现数据。思路讲解完了后,有的读者可能依然理解得不太清楚,那么为了感觉更直观些,我们通过一个图来理解下:
public class JsonService {
public JsonService() {
// TODO Auto-generated constructor stub
}
public Person getPerson() {
Person person = new Person();
person.setId(1001);
person.setUserName("jack");
person.setPassword("123");
return person;
}
public List getlistPerson() {
List list = new ArrayList();
Person person1 = new Person();
person1.setId(1001);
person1.setUserName("jack");
person1.setPassword("123");
Person person2 = new Person();
person2.setId(1002);
person2.setUserName("rose");
person2.setPassword("123");
Person person3 = new Person();
person3.setId(1003);
person3.setUserName("joly");
person3.setPassword("123");
list.add(person1);
list.add(person2);
list.add(person3);
return list;
}
public List getListString() {
List list = new ArrayList();
list.add("jack");
list.add("rose");
list.add("joly");
return list;
}
public ArrayList
JsonTools类复杂将Java对象或集合转换成Json字符串,具体代码如下:
public class JsonTools {
public static String createJsonString(String key, Object value) {
/**
* 使用Json原生库解析数据时,使用该方法返回Json字符串
*/
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
/**
* 使用Gson,Jackson和FastJson解析数据时,使用该方法返回Json字符串
*/
/*Gson mGson = new Gson();
return mGson.toJson(value);*/
}
}
Person为entity对象,具体的代码如下:
public class Person {
private int id;
private String userName;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person [id=" + id + ", userName=" + userName + ", password="
+ password + "]";
}
}
UserGetServlet的作用是接受客户端请求,初始化Json数据,以及将数据返回给客户端,具体的代码如下:
/**
* Servlet implementation class UserGetServlet
*/
public class UserGetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private JsonService mService;
/**
* @see HttpServlet#HttpServlet()
*/
public UserGetServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String jsonString = "";
String action_flag = request.getParameter("action_flag");
if (action_flag.equals("person")) {
jsonString = JsonTools.createJsonString("person", mService
.getPerson());
} else if (action_flag.equals("listperson")) {
jsonString = JsonTools.createJsonString("listperson", mService
.getlistPerson());
} else if (action_flag.equals("liststring")) {
jsonString = JsonTools.createJsonString("liststring", mService
.getListString());
}else if(action_flag.equals("listmapperson")){
jsonString = JsonTools.createJsonString("listmapperson", mService.getListMap());
}
out.println(jsonString);
out.flush();
out.close();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
mService = new JsonService();
}
}
好的,服务端的代码我们便编写完毕,我们来运行一下程序,运行效果如下:
/**
* 网络访问类
* @author AndroidLeaf
*/
public class HttpUtils {
/**
* 使用HttpURLConnection方式从网络中获取数据
* @param urlStr
* @return
*/
public static String getStringFromNetWork(String urlStr)
{
URL mUrl = null;
HttpURLConnection mConnection= null;
String result = null;
try {
mUrl = new URL(urlStr);
mConnection = (HttpURLConnection)mUrl.openConnection();
mConnection.setDoOutput(true);
mConnection.setDoInput(true);
mConnection.setReadTimeout(5 * 1000);
mConnection.setConnectTimeout(15 * 1000);
mConnection.setRequestMethod("GET");
int responseCode = mConnection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
//获取下载资源的大小
//contentLength = mConnection.getContentLength();
result = changeInputStreamToString(mConnection.getInputStream());
return result;
}
} catch (IOException e) {
// TODO: handle exception
}
return "";
}
/**
* 将字节流数据转换成字符串
* @param mInputStream 需要转换的字节流
* @return result 转换后的结果
*/
private static String changeInputStreamToString(InputStream mInputStream)
{
ByteArrayOutputStream mArrayOutputStream = new ByteArrayOutputStream();
String result = null;
byte[] mBytes = new byte[2048];
int len = -1;
try {
while((len = mInputStream.read(mBytes)) != -1)
{
mArrayOutputStream.write(mBytes, 0, len);
mArrayOutputStream.flush();
}
result = new String(mArrayOutputStream.toByteArray(), "UTF-8");
return result;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(mInputStream != null){
mInputStream.close();
}
if(mArrayOutputStream != null){
mArrayOutputStream.close();
}
} catch (Exception e2) {
// TODO: handle exception
}
}
return "";
}
}
接着是MyAsynctask类,该类主要作用是将网络请求放在异步任务中进行,以免阻塞UI线程,具体的代码如下:
/**
* 异步任务处理类
* @author AndroidLeaf
*/
public class MyAsynctask extends AsyncTask
/**
* 网络请求的Url地址
* @author AndroidLeaf
*
*/
public class Constants {
public static final String BASE_PATH = "http://10.0.2.2:8080/08_Android_JsonServer_Blog/UserGetServlet?action_flag=";
public static final String GET_PERSON_PATH = BASE_PATH + "person";
public static final String GET_LISTPERSON_PATH = BASE_PATH + "listperson";
public static final String GET_LISTSTRING_PATH = BASE_PATH + "liststring";
public static final String GET_LISTMAPPERSON_PATH = BASE_PATH + "listmapperson";
}
public class JsonTools {
/**-----------------Json数据解析----------------------------*/
public static Person JsonToPerson(String key,String jsonStr)
{
Person mPerson = new Person();
try {
JSONObject mJsonObject = new JSONObject(jsonStr);
JSONObject mJsonObject2 = mJsonObject.getJSONObject(key);
mPerson.setId(mJsonObject2.getInt("id"));
mPerson.setUserName(mJsonObject2.getString("userName"));
mPerson.setPassword(mJsonObject2.getString("password"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mPerson;
}
public static ArrayList JsonToListPerson(String key,String jsonStr)
{
ArrayList mPersons = new ArrayList();
try {
JSONObject mJsonObject = new JSONObject(jsonStr);
JSONArray mArray = mJsonObject.getJSONArray(key);
for(int i = 0 ; i < mArray.length() ; i++)
{
Person mPerson = new Person();
JSONObject mJsonObject2 = mArray.getJSONObject(i);
mPerson.setId(mJsonObject2.getInt("id"));
mPerson.setUserName(mJsonObject2.getString("userName"));
mPerson.setPassword(mJsonObject2.getString("password"));
mPersons.add(mPerson);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mPersons;
}
public static ArrayList jsonToListString(String key,String jsonStr)
{
ArrayList mStrings = new ArrayList();
JSONObject mJsonObject;
try {
mJsonObject = new JSONObject(jsonStr);
JSONArray mArray = mJsonObject.getJSONArray(key);
for(int i = 0 ;i < mArray.length();i++)
{
mStrings.add(mArray.getString(i));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mStrings;
}
public static ArrayList> jsonToListMapPerson(String key,String jsonStr)
{
ArrayList> listMaps = new ArrayList>();
try {
JSONObject mJsonObject = new JSONObject(jsonStr);
JSONArray mJsonArray = mJsonObject.getJSONArray(key);
for(int i = 0 ;i < mJsonArray.length();i++)
{
JSONObject mJsonObject2 = mJsonArray.getJSONObject(i);
Map maps = new HashMap();
Iterator mIterator = mJsonObject2.keys();
ArrayList mListKey = new ArrayList();
ArrayList mListValue = new ArrayList();
while(mIterator.hasNext())
{
String mapKey = mIterator.next();
Object mObject = mJsonObject2.get(mapKey);
System.out.println(mObject.toString());
mListValue.add("{"+ mapKey + ":" + mObject.toString() + "}");
mListKey.add(mapKey);
}
for(int j = 0; j < mListKey.size(); j++)
{
JSONObject mJsonObject3 = new JSONObject(mListValue.get(j));
JSONObject mJsonObject4 = mJsonObject3.getJSONObject(mListKey.get(j));
Person mPerson = new Person();
mPerson.setId(mJsonObject4.getInt("id"));
mPerson.setUserName(mJsonObject4.getString("userName"));
mPerson.setPassword(mJsonObject4.getString("password"));
maps.put(mListKey.get(j), mPerson);
}
listMaps.add(maps);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listMaps;
}
}
将Json数据解析成对应的Java对象或集合后,最后我们将数据绑定到ListView控件上,并展示在客户界面,这里涉及到两个类BaseActivity和JsonActivity,BaseActivity类的代码如下:
public abstract class BaseActivity extends ListActivity implements HttpDownloadedListener{
public ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_json);
//初始化数据
initData();
}
public void initData(){
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setTitle("正在加载中.....");
mProgressDialog.show();
downloadData(Constants.GET_PERSON_PATH,R.id.json_person);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TOdO Auto-generated method stub
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TOdO Auto-generated method stub
String urlStr = null;
int typeId = -1;
switch (item.getItemId()) {
case R.id.json_person:
urlStr = Constants.GET_PERSON_PATH;
typeId = R.id.json_person;
break;
case R.id.json_string:
urlStr = Constants.GET_LISTSTRING_PATH;
typeId = R.id.json_string;
break;
case R.id.json_list_person:
urlStr = Constants.GET_LISTPERSON_PATH;
typeId = R.id.json_list_person;
break;
case R.id.json_listmap_person:
urlStr = Constants.GET_LISTMAPPERSON_PATH;
typeId = R.id.json_listmap_person;
break;
default:
break;
}
downloadData(urlStr,typeId);
mProgressDialog.show();
return super.onOptionsItemSelected(item);
}
/**
* 根据Url地址下载数据
* @param urlStr Url地址
* @param typeId 下载的类型ID,这里使用控件ID
*/
public void downloadData(String urlStr,int typeId){
MyAsynctask mAsynctask = new MyAsynctask();
mAsynctask.setOnHttpDownloadedListener(this);
mAsynctask.execute(urlStr,typeId);
}
public void bindData(ArrayList mList){
ArrayAdapter mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, mList);
setListAdapter(mAdapter);
if(mProgressDialog.isShowing()){
mProgressDialog.dismiss();
}
}
/**
* 将Person集合转换为String集合
* @param mList
* @return
*/
public ArrayList personsToString(ArrayList mList){
ArrayList mStrings = new ArrayList();
for(int i = 0;i < mList.size();i++){
mStrings.add(mList.get(i).toString());
}
return mStrings;
}
/**
* 将Persons Map集合装换为String集合
* @param listMap
* @return
*/
public ArrayList listmappersonsToString(ArrayList> listMap){
ArrayList mStrings = new ArrayList();
for(Map map: listMap){
for(Map.Entry entry: map.entrySet()){
mStrings.add(entry.getKey() +":"+ entry.getValue().toString());
}
}
return mStrings;
}
}
JsonActivity代码如下:
public class JsonActivity extends BaseActivity {
@Override
public void onDownloaded(String result,int typeId) {
// TODO Auto-generated method stub
ArrayList mList = new ArrayList();
switch (typeId) {
case R.id.json_person:
Person mPerson = JsonTools.JsonToPerson("person", result);
mList.add(mPerson.toString());
break;
case R.id.json_string:
ArrayList mArrayList = JsonTools.jsonToListString("liststring", result);
mList.addAll(mArrayList);
break;
case R.id.json_list_person:
ArrayList mPersons = JsonTools.JsonToListPerson("listperson", result);
mList.addAll(personsToString(mPersons));
break;
case R.id.json_listmap_person:
ArrayList> maps = JsonTools.jsonToListMapPerson("listmapperson", result);
mList.addAll(listmappersonsToString(maps));
break;
default:
break;
}
bindData(mList);
}
}
至此,我们便将服务端和客户端的所有代码编写完毕,下面我们开始运行测试,首先运行服务端程序,然后再在Android模拟器中运行客户端程序,运行及操作效果如下图: