天天看點

Gson 解析複雜json字元串

    對Gson不了解的同學可以先去了解下Gson的基本用法

需要解析的Json字元串如下: {"data":{"data":[{"id":"310000","indexId":"01","provinceName":"上海"},{"id":"320000","indexId":"02","provinceName":"江蘇省"}]},"result":"ok"}

先貼上解析json字元串的代碼:

public ResponseData<Province_net> providerNetProviceListData(String result) {
		ResponseData<Province_net> responseData = new ResponseData<Province_net>();
		ResponseEntity<Province_net> responseEntity = new ResponseEntity<Province_net>();
		Gson gson = new Gson();
		BaseNetData<BaseNetProvincesList<Province_net>> baseNetData = gson.fromJson(
				result,
				new TypeToken<BaseNetData<BaseNetProvincesList<Province_net>>>() {
				}.getType());
		
		String resultCode = baseNetData.getResult();

		if (null != resultCode && !TextUtils.isEmpty(resultCode)) {
			if (resultCode.equalsIgnoreCase("ok")) {
				responseData.setStatusCode(ResponseData.STATUS_CODE_SUCCESS);
				responseEntity.setSuccessList(baseNetData.getData().getData());

				responseData.setResponseEntity(responseEntity);
			}
			// redscs
			else if (resultCode.equals("NO_DATA")) {
				responseData.setStatusCode(ResponseData.STATUS_CODE_FAILURE);
				responseEntity.setFailureMsg("沒有資料");
				responseData.setResponseEntity(responseEntity);
			} else if (resultCode.equalsIgnoreCase("EXCEPTION")) {
				responseData.setStatusCode(ResponseData.STATUS_CODE_FAILURE);
				responseEntity.setFailureMsg("伺服器端異常");
				responseData.setResponseEntity(responseEntity);
			} else if (resultCode.equalsIgnoreCase(INVALID_TOKEN)) {
				responseData.setStatusCode(ResponseData.STATUS_CODE_FAILURE);
				responseEntity.setFailureMsg(INVALID_TOKEN);
				responseData.setResponseEntity(responseEntity);
			} else {
				responseData.setStatusCode(ResponseData.STATUS_CODE_FAILURE);
				responseEntity.setFailureMsg("未知錯誤");
				responseData.setResponseEntity(responseEntity);
			}
		} else {
			responseData.setStatusCode(ResponseData.STATUS_CODE_FAILURE);
			responseEntity.setFailureMsg("擷取資料異常");
			responseData.setResponseEntity(responseEntity);
		}
		return responseData;
	}
           

首先我們定義了一個資料bean用來裝載Gson解析出來的資料:

public class ResponseData<T> {

	public static final int STATUS_CODE_SUCCESS = STATUS_CODE_BEGIN + 1;
	public static final int STATUS_CODE_FAILURE = STATUS_CODE_BEGIN + 2;

	private int statusCode;
	private ResponseEntity<T> responseEntity;

	public int getStatusCode() {
		return statusCode;
	}

	public void setStatusCode(int statusCode) {
		this.statusCode = statusCode;
	}

	public ResponseEntity<T> getResponseEntity() {
		return responseEntity;
	}

	public void setResponseEntity(ResponseEntity<T> responseEntity) {
		this.responseEntity = responseEntity;
	}
}
           

此類将所有的傳回分成傳回碼statusCode和傳回的實體responseEntity兩個部分。

然後定義了一個針對上述基本bean的實體的bean,

public class ResponseEntity<T> {

	private String failureMsg;
	private T successEntity;
	private int totalCount;
	private List<T> successList;

	public String getFailureMsg() {
		return failureMsg;
	}

	public void setFailureMsg(String failureMsg) {
		this.failureMsg = failureMsg;
	}

	public T getSuccessEntity() {
		return successEntity;
	}

	public void setSuccessEntity(T successEntity) {
		this.successEntity = successEntity;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public List<T> getSuccessList() {
		return successList;
	}

	public void setSuccessList(List<T> successList) {
		this.successList = successList;
	}

}
           

  這個bean中有四個屬性,分别為:當傳回的資料格式為json對象的時候的successEntity ,錯誤資訊failureMsg,傳回資料格式為jsonArray的successList 以及jsonArray的長度。

 下面針對具體的傳回定義了一個基礎Bean:

public class BaseNetData<T> {

	private String result;
	private T data;

	public String getResult() {
		return result;
	}

	public T getData() {
		return data;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public void setData(T data) {
		this.data = data;
	}

}
           

針對{"data":{"data":[{"id":"310000","indexId":"01","provinceName":"上海"},{"id":"320000","indexId":"02","provinceName":"江蘇省"}]},"result":"ok"}   。  此類中的result屬性對應json字元串中的“result”, data對應着“data” 。(一定保證字段名字的一緻)。

然後對于{"data":[{"id":"310000","indexId":"01","provinceName":"上海"},{"id":"320000","indexId":"02","provinceName":"江蘇省"}]} ,使用如下:

public class BaseNetListData<T> {

	private int total;
	private List<T> data;

	public int getTotal() {
		return total;
	}

	public List<T> getData() {
		return data;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public void setData(List<T> data) {
		this.data = data;
	}

}
           

如果傳回不是jsonArray而是jsonObject,則

public class BaseNetEntityData<T> {
	
	private T data;

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

}
           

       通過以上的封裝我們可以根據伺服器的傳回類型來調整自己的資料bean,進而實作代碼的複用。。。。。。