关于解析json为不固定格式

1.针对后台是用php写的,由于php是弱对象类型,他不像java一样(java中如果一个对象不存在,他会返回null,但是php中如果是一个对象不存在他也有可能返回字符串类型的“”)

所以针对php,为了达到兼容性,写的就不能无脑得用new Gson().fromJson(String json,Class<T> classOfT)来解析,这样解析是针对对象是固定类型的,如果不固定,就要自己一层层解析:

/**
 * 为了解析php对象不固定用
 * 
 * @author liulj
 * 
 * @param <T>
 */
public interface IBaseBean<T> {

	/**
	 * 解析父类中的共通字段
	 * 
	 * @param inputJsonObj
	 * @return
	 */
	public abstract T parseJsonInBaseBean(JSONObject inputJsonObj);

	/**
	 * 解析子类中的字段
	 * 
	 * @param inputJsonObj
	 * @return
	 */
	public abstract T parseJson(JSONObject inputJsonObj);
}

/**
 * 解析基础类
 * 
 * @author liulj
 * 
 * @param <T>
 */
public abstract class BaseBean<T> implements IBaseBean<T>, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected String err;
	protected String _time;
	protected String etag;
	protected T data;

	@Override
	public T parseJsonInBaseBean(JSONObject inputJsonObj) {
		setErr(inputJsonObj.optString("err"));
		set_time(inputJsonObj.optString("_time"));
		setEtag(inputJsonObj.optString("etag"));
		return parseJson(inputJsonObj);
	}

	@Override
	public abstract T parseJson(JSONObject inputJsonObj);

	public String getErr() {
		return err;
	}

	public void setErr(String err) {
		this.err = err;
	}

	public String get_time() {
		return _time;
	}

	public void set_time(String _time) {
		this._time = _time;
	}

	public T getData() {
		return data;
	}

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

	public String getEtag() {
		return etag;
	}

	public void setEtag(String etag) {
		this.etag = etag;
	}

}

@SuppressWarnings("serial")
public class MyAppointmentListBean extends BaseBean<MyAppointmentListBean> {
	private int total;
	private List<MyAppointmentInfoBean> list;

	@Override
	public MyAppointmentListBean parseJson(JSONObject inputJsonObj) {
		if (inputJsonObj != null) {
			inputJsonObj = inputJsonObj.optJSONObject("data");
			if (inputJsonObj != null) {
				total = inputJsonObj.optInt("total");
				JSONArray array = inputJsonObj.optJSONArray("list");
				if (array != null) {
					list = new ArrayList<MyAppointmentInfoBean>();
					int length = array.length();
					for (int i = 0; i < length; i++) {
						JSONObject object = array.optJSONObject(i);
						if (object != null) {
							list.add(new MyAppointmentInfoBean().parseJson(object));
						}
					}
				}
			}
		}
		setData(this);
		return this;
	}

	public int getTotal() {
		return total;
	}

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

	public List<MyAppointmentInfoBean> getList() {
		return list;
	}

	public void setList(List<MyAppointmentInfoBean> list) {
		this.list = list;
	}

}

实则是通过inputJsonObj = inputJsonObj.optJSONObject("data");这句判断是否是对象类型或者是字符串类型,如果是对象类型就接着向下解析,如果是字符串类型就会返回null,则不用向下解析

你可能感兴趣的:(json,bean,gson)