项目中用到这么两个类,需要变成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}]"}]