Gson 解析复杂json字符串

本文介绍了如何使用Gson库解析复杂的JSON字符串,包括创建对应的Java Bean模型,并展示了如何处理包含嵌套对象和数组的JSON数据。通过示例代码详细解释了如何映射JSON字段到Java对象,以实现灵活的代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    对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,从而实现代码的复用。。。。。。

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值