Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Androidannotation使用之@Rest與服務器交互的JSON數據轉換(二)

Androidannotation使用之@Rest與服務器交互的JSON數據轉換(二)

編輯:關於Android編程

開篇

之前的一篇博客:Androidannotation使用之@Rest獲取資源及用戶登錄驗證(一):http://blog.csdn.net/nupt123456789/article/details/24384713 主要寫了Rest在用戶登錄的時候,需要JSESSION字段的問題。本博客主要寫JSON格式的轉換。

@Rest的參考文檔:

https://github.com/excilys/androidannotations/wiki/Rest-API#rest

簡介:

從上一篇博客中,我們可以看出,我們直接再浏覽器中請求http://192.168.0.101:8080/cbvr/getUserInfoList.action 的時候,返回的字符串其實是JSON格式。我們上一篇博客,就是把它直接當String進行處理了,沒有出現什麼問題。當然,我們接下來,可以使用GSON對String進行解析,這沒有什麼問題。然而,我們通常想,我們換一個轉換器不就行了嗎?代碼如下:

/*
 * $filename: UserService.java,v $
 * $Date: 2014-4-20  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;

import org.androidannotations.annotations.rest.Accept;
import org.androidannotations.annotations.rest.Post;
import org.androidannotations.annotations.rest.Rest;
import org.androidannotations.api.rest.MediaType;
import org.androidannotations.api.rest.RestClientErrorHandling;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.GsonHttpMessageConverter;

/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-20  Nanjing,njupt,China
 */
@Rest(rootUrl = "http://192.168.0.101:8080/cbvr", converters = {GsonHttpMessageConverter.class})
public interface UserService extends RestClientErrorHandling{
	@Post("/getUserInfoList.action")
	@Accept(MediaType.APPLICATION_JSON)
	ResponseEntity getUserInfoList();
}

這樣,我們就使用了Gson的消息轉換器,當然,需要導入GSON相關的包。但是運行程序的時候,發現報錯如下:

05-02 16:58:32.644: W/System.err(7454): org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.example.testaa.DataGrid] and content type [text/html;charset=UTF-8]

說什麼沒有合適的HttpMessageConverter,我以為是android端的問題,就換了好幾個轉換器,結果依然報錯。然後,才發現,原來不是android端的問題,是服務端。服務端每次輸出json字符串時,都設置了如下屬性:

response.setContentType("text/html;charset=UTF-8");

原來是這個原因,於是,將服務端的修改為如下:

response.setContentType("application/json;charset=utf-8");

然後,再次運行,OK了,大功告成!這樣,我們就可以直接獲得到轉換為JSON格式之後的對象了。為了增加程序的健壯性,為其添加了ErrorHandler處理。余下代碼如下:

package com.example.testaa;


/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *GitHub   https://github.com/nuptboyzhb
 *mail:    [email protected]
 *2014-1-12  Nanjing,njupt,China
 */
public class Userinfo {
	/**
	 * {field : 'yhm',title : '用戶名',width : 150}, 
			{field : 'pwd',title : '密碼',width : 150},
			{field : 'yhqx',title : '用戶權限',width : 150}, 
			{field : 'zcsj',title : '注冊時間',width : 150},
			{field : 'bz',title : '備注',width : 180}] ];
	 */
	private String id;
	private String yhm;
	private String pwd;
	private String yhqx;
	private String zcsj;
	private String bz;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getYhm() {
		return yhm;
	}
	public void setYhm(String yhm) {
		this.yhm = yhm;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getYhqx() {
		return yhqx;
	}
	public void setYhqx(String yhqx) {
		this.yhqx = yhqx;
	}
	public String getZcsj() {
		return zcsj;
	}
	public void setZcsj(String zcsj) {
		this.zcsj = zcsj;
	}
	public String getBz() {
		return bz;
	}
	public void setBz(String bz) {
		this.bz = bz;
	}
}

DataGrid類

/*
 * $filename: DataGrid.java,v $
 * $Date: 2013-10-11  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;


/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2013-10-11  Nanjing,njupt,China
 */
public class DataGrid{
    private int total;
    private Userinfo[] rows;
	public Userinfo[] getRows() {
		return rows;
	}
	public void setRows(Userinfo[] rows) {
		this.rows = rows;
	}
	public int getTotal() {
		return total;
	}
	public DataGrid(int total, Userinfo[] rows) {
		this.total = total;
		this.rows = rows;
	}
	public DataGrid( ) {
	}
	public void setTotal(int total) {
		this.total = total;
	}
}

ErrorHandler

/*
 * $filename: ErrorHandlerForUserService.java,v $
 * $Date: 2014-4-29  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package com.example.testaa;

import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.api.rest.RestErrorHandler;
import org.springframework.web.client.RestClientException;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-29  Nanjing,njupt,China
 */
@EBean
public class MyErrorHandler implements RestErrorHandler {

	@RootContext
	Context context;
	
	@Override
	public void onRestClientExceptionThrown(RestClientException e) {
		// TODO Auto-generated method stub
		e.printStackTrace();
		Log.d("REST", e.toString());
		showError();
	}
	
	@UiThread
	void showError(){
		Toast.makeText(context, "Rest Error...", Toast.LENGTH_SHORT).show();
	}

}

剩下的就是MainActivity

package com.example.testaa;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.rest.RestService;
import org.springframework.http.ResponseEntity;

import android.app.Activity;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    [email protected]
 *2014-4-15  Nanjing,njupt,China
 */
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
	
	private static final String TAG="AAREST";
	@ViewById
	Button getUser;

	@ViewById
	TextView myTextView;

	@RestService
	UserService userService;
	
	@Bean
	MyErrorHandler  errorHandlerForUserService;
	
	@AfterViews
	void afterView(){
		//設置ErrorHandler
		userService.setRestErrorHandler(errorHandlerForUserService);
	}
	/**
	 * 獲取用戶列表
	 */
	@Click
	void getUser() {
		getUserInBackground();
	}
	/**
	 * 獲取用戶列表
	 * 無需登錄
	 */
	@Background
	void getUserInBackground(){
		//String result = userService.getUserInfoList();
		//Gson gson = new Gson();
		//DataGrid  dataGrid = gson.fromJson(result, DataGrid.class);
		ResponseEntity responseEntiy = userService.getUserInfoList();
		if(null == responseEntiy){
			return;
		}
		DataGrid  dataGrid = responseEntiy.getBody();
		Userinfo[] userinfos= dataGrid.getRows();
		String string = "";
		for(Userinfo userinfo:userinfos){
			string = string + "user:"+ userinfo.getYhm();
			Log.d(TAG, userinfo.getYhm());
		}
		Log.d(TAG, string);
		displayTextView(string);
	}
	
	@UiThread
	void displayTextView(String string){
		myTextView.setText(string);
	}
}


總結:

整個項目使用AndroidAnnotation框架。本次博客主要解決服務端和android進行json交互的情況。

缺點:Response的setContentType設置修改後,可能影響原網站對浏覽器的支持,因此,需要根據不同場景進行選擇。

整個項目下載地址:http://download.csdn.net/detail/nuptboyzhb/7283863

未經允許,不得用於商業目的


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved