您的位置:首页 > Web前端 > JavaScript

Gson 解析复杂json字符串

2015-11-16 15:36 591 查看
对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,从而实现代码的复用。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: