由于gson在转换Map泛型时无法deserializer回来.比如Map<String,String>,它将json string重新转换为Map时会将里面的string变成父类对象Object,所以我们需要重新将adapter进行封装或者添加自己的adapter.
由于工作原因,我需要接受和发送JSONObject,所以我给出的是基于gson中封装org.json.JSONObject例子.有兴趣的可以看下JSONObject,他其实就是MAP的封装实现.
* Data area.The key is upper word.
return "FirstEndBean [data=" + data + ", successful=" + successful + "]";
------------------------ 華麗的分割線------------------------------
package org.seaya.common;
import java.lang.reflect.Type;
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.InstanceCreator;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
public class JsonConvert {
/**
* FirstEndBean create logger object.
*/
private static final Logger logger = Logger.getLogger(JsonConvert.class);
/**
* Covert Json String to {@code FirstEndBean}
*
* @param json
* It's Json String
* @return {@code FirstEndBean} Covert result
*/
public static FirstEndBean convertJsonToFirstEndBean(String json) {
Type type = new TypeToken<FirstEndBean>() {
}.getType();
Gson gson = getGson();
try {
FirstEndBean tBean = gson.fromJson(json, type);
if (logger.isDebugEnabled()) {
logger.debug("FirstEndBean is send string: " + json);
}
return tBean;
} catch (JsonParseException ex) {
logger.error("JsonParseException: " + ex.getMessage());
ex.printStackTrace();
}
return null;
}
/**
* Covert {@code FirstEndBean} to Json String
*
* @param firstEndBean
* A FirstEndBean object
* @return {@code String} Json String
*/
public static String convertFirstEndBeanToJson(FirstEndBean firstEndBean) {
Type type = new TypeToken<FirstEndBean>(){}.getType();
Gson gson = getGson();
String jsonString = gson.toJson(firstEndBean, type);
if (logger.isDebugEnabled()) {
logger.debug("FirstEndBean is send string: " + jsonString);
}
return jsonString;
}
/**
* JSONObject Type Adapter will serializer JSONOjbect to String
* and deserializer String to JSONOjbect
*/
static class JSONObjectTypeAdapter implements JsonSerializer<JSONObject>,
JsonDeserializer<JSONObject>, InstanceCreator<JSONObject> {
public JsonElement serialize(JSONObject src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
public JSONObject deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
try {
return new JSONObject(json.getAsString());
} catch (JSONException e) {
return new JSONObject();
}
}
public JSONObject createInstance(Type type) {
return new JSONObject();
}
@Override
public String toString() {
return JSONObjectTypeAdapter.class.getSimpleName();
}
}
/**
* Get Gson Object
*/
public static Gson getGson() {
GsonBuilder builder = new GsonBuilder();
Type type = new TypeToken<JSONObject>(){}.getType();
return builder.registerTypeAdapter(type, new JSONObjectTypeAdapter()).create();
}
public static void main(String[] args) throws JSONException {
JsonConvert convert = new JsonConvert();
FirstEndBean sendbean = Simulate.register();
convert.test(sendbean);
}
private void test(final FirstEndBean sendbean) {
String jsonString = JsonConvert.convertFirstEndBeanToJson(sendbean);
// System.out.println("sendbean: " + sendbean);
System.out.println("sendbean jsonString: " + jsonString);
// FirstEndBean resultbean =
// JsonConvert.convertJsonToFirstEndBean(jsonString);
// System.out.println("resultbean: " + resultbean);
}
}