`
chaoran
  • 浏览: 24409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

gson的泛型实例

阅读更多

    项目中用到这么两个类,需要变成json对象,使用的gson版本是1.4。

public class SelectItem<T> implements Serializable{
	private T value;
	private String text;
	private String image;
	
	public SelectItem(T value, String text){
		this.value = value;
		this.text = text;
	}
	
	public SelectItem(T value, String text, String image){
		this.value = value;
		this.text = text;
		this.image = image;
	}
	
	public int compareTo(Object object){
		if (object == null) return 0;
		if (object instanceof SelectItem){
			@SuppressWarnings("unchecked")
			SelectItem<T> o = (SelectItem<T>)object;
			return new CompareToBuilder().append(value, o.value).toComparison();
		}else{
			return 0;
		}
	}

	public T getValue() {
		return value;
	}

	public String getText() {
		return text;
	}

	public String getImage() {
		return image;
	}

}

 

 

public class DoubleSelect<T> extends SelectItem<T>{
	private List<SelectItem<?>> subs;
	
	public DoubleSelect(T value, String text){
		super(value, text);
	}
	
	public DoubleSelect(T value, String text, String image){
		super(value, text, image);
	}
	
	public <E> DoubleSelect<T> addSubItem(E value, String text){
		if (subs == null){
			subs = new ArrayList<SelectItem<?>>();
		}
		subs.add(new SelectItem<E>(value, text));
		return this;
	}
	
	public <E> DoubleSelect<T> addSubItem(E value, String text, String image){
		if (subs == null){
			subs = new ArrayList<SelectItem<?>>();
		}
		subs.add(new SelectItem<E>(value, text, image));
		return this;
	}

	public List<SelectItem<?>> getSubs() {
		return subs;
	}
	
}

 

 

定义的gson类如下

public class DoubleSelectGson<T> {
	public String toJson(List<SelectItem<T>> items){
		GsonBuilder gb = new GsonBuilder().serializeNulls();
		gb.registerTypeAdapter(DoubleSelect.class, new DoubleSelectSerializer());
		Gson gson = gb.create();
		return gson.toJson(items);
	}
	
	private class DoubleSelectSerializer implements JsonSerializer<DoubleSelect<T>> {
		public JsonElement serialize(DoubleSelect<T> src, Type typeOfSrc, JsonSerializationContext context) {
			Class<?> c = src.getValue().getClass();
			JsonObject rn = new JsonObject();			
			if (c.equals(String.class)){
				rn.addProperty("value", (String)src.getValue());
			}else if (c.equals(Integer.class)){
				rn.addProperty("value", (Integer)src.getValue());
			}else if (c.equals(Long.class)){
				rn.addProperty("value", (Long)src.getValue());
			}
			if (src.getSubs() != null){
				Class<?> s = src.getSubs().get(0).getValue().getClass();
				SelectItemGson subGson = null;
				if (s.equals(String.class)){
					subGson = new SelectItemGson<String>();
				}else if (s.equals(Integer.class)){
					subGson = new SelectItemGson<Integer>();
				}else if (s.equals(Long.class)){
					subGson = new SelectItemGson<Long>();
				}
				String json = subGson.toJson(src.getSubs());
				rn.addProperty("sub", json.replaceAll("\"", "'"));

			}
			return rn;
		}
	}

}

 

public class SelectItemGson<T> {	
	public String toJson(List<SelectItem<T>> items){
		GsonBuilder gb = new GsonBuilder().serializeNulls();
		gb.registerTypeAdapter(SelectItem.class, new SelectItemSerializer());
		Gson gson = gb.create();
		return gson.toJson(items);
	}
	
	public class SelectItemSerializer implements JsonSerializer<SelectItem<T>> {
		public JsonElement serialize(SelectItem<T> src, Type typeOfSrc, JsonSerializationContext context) {
			JsonObject rn = new JsonObject();
			Class<?> c = src.getValue().getClass();
			if (c.equals(String.class)){
				rn.addProperty("value", (String)src.getValue());
			}else if (c.equals(Integer.class)){
				rn.addProperty("value", (Integer)src.getValue());
			}else if (c.equals(Long.class)){
				rn.addProperty("value", (Long)src.getValue());
			}
			rn.addProperty("text", src.getText());
			rn.addProperty("image", src.getImage());
			return rn;
		}
	}
}

 

调用方法是

new DoubleSelectGson<Integer>().toJson(ConstantUtil.allGenders);

 

 allGenders就是一个List<SelectItem<Integer>>的对象。

 

得到的返回值是

[{"value":1,"sub":"[{\u0027value\u0027:\u0027shaver\u0027,\u0027text\u0027:\u0027剃须刀\u0027,\u0027image\u0027:null},{\u0027value\u0027:\u0027neckcloth\u0027,\u0027text\u0027:\u0027领带\u0027,\u0027image\u0027:null}]"},{"value":2,"sub":"[{\u0027value\u0027:\u0027skirt\u0027,\u0027text\u0027:\u0027裙子\u0027,\u0027image\u0027:null},{\u0027value\u0027:\u0027high-heel shoe\u0027,\u0027text\u0027:\u0027高跟鞋\u0027,\u0027image\u0027:null}]"}]

 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics