策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
public class JsonTool {
private static String TAG = "JsonTool";
private static IJsonAdapter sIJsonAdapter;
private static IJsonAdapter getAdapter() {
if (sIJsonAdapter == null) {
throw new RuntimeException(">>>>>>>>>Error!<<<<<<<<, Using default GsonAdapter");
}
return sIJsonAdapter;
}
/**
* 设置自定义的Adapter
* public class GsonAdapter implements JsonTool.IJsonAdapter {
* private static final String TAG = "GsonAdapter";
*
* private Gson sGson;
*
* public GsonAdapter() {
* GsonBuilder gb = new GsonBuilder();
* gb.registerTypeAdapter(Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG);
* gb.registerTypeAdapter(Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG);
* gb.registerTypeAdapter(ActionBase.class, new JsonDeserializer<ActionBase>() {
*
* @Override
* public ActionBase deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
* try {
* return ActionFactroyUtil.createActionBaseFromActionString(0, json.toString());
* } catch (JSONException e) {
* e.printStackTrace();
* }
* return null;
* }
* });
* gb.setPrettyPrinting();
* sGson = gb.create();
* }
*
* public static class DateDeserializer implements JsonDeserializer<Date> {
* public DateDeserializer() {
* }
*
* public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
* return new Date(json.getAsJsonPrimitive().getAsLong());
* }
* }
*
* public static class DateSerializer implements JsonSerializer<Date> {
* public DateSerializer() {
* }
*
* public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
* return new JsonPrimitive(src.getTime());
* }
* }
*
* @Override
* public <T> T fromJson(String jsonString, Class<T> cls) {
* return (T) sGson.fromJson(jsonString, cls);
* }
*
* public <T> T fromJsonToCollections(String jsonString) {
* TypeToken<T> typeToken = new TypeToken<T>() {
* };
* return (T) sGson.fromJson(jsonString, typeToken.getType());
* }
*
* @Override
* public String toJson(Object object) {
* return sGson.toJson(object);
* }
* }
* */
public static void setCustomJsonAdapter(IJsonAdapter sIJsonAdapter) {
JsonTool.sIJsonAdapter = sIJsonAdapter;
}
public interface IJsonAdapter {
<T> T fromJson(String jsonString, Class<T> cls);
<T> T fromJsonToCollections(String jsonString);
String toJson(Object object);
}
public static <T> T fromJson(String jsonString, Class<T> cls) {
return getAdapter().fromJson(jsonString, cls);
}
public static <T> T fromJsonToCollections(String jsonString) {
return getAdapter().fromJsonToCollections(jsonString);
}
public static String toJson(Object object) {
return getAdapter().toJson(object);
}
}
Gson
public class GsonAdapter implements JsonTool.IJsonAdapter {
private static final String TAG = "GsonAdapter";
private Gson sGson;
public GsonAdapter() {
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG);
gb.registerTypeAdapter(Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG);
gb.registerTypeAdapter(ActionBase.class, new JsonDeserializer<ActionBase>() {
@Override
public ActionBase deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
try {
return ActionFactroyUtil.createActionBaseFromActionString(0, json.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
});
// gb.setPrettyPrinting();
sGson = gb.create();
}
public static class DateDeserializer implements JsonDeserializer<Date> {
public DateDeserializer() {
}
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
}
public static class DateSerializer implements JsonSerializer<Date> {
public DateSerializer() {
}
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getTime());
}
}
@Override
public <T> T fromJson(String jsonString, Class<T> cls) {
return (T) sGson.fromJson(jsonString, cls);
}
public <T> List<T> fromJsonToList(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
JsonArray array = new JsonParser().parse(jsonString).getAsJsonArray();
for (JsonElement jsonElement : array) {
list.add(sGson.fromJson(jsonElement, cls));
}
return list;
}
@Override
public String toJson(Object object) {
return sGson.toJson(object);
}
}
FastJson
public class FastJsonAdapter implements JsonTool.IJsonAdapter {
private static final String TAG = "GsonAdapter";
public FastJsonAdapter() {
}
@Override
public <T> T fromJson(String jsonString, Class<T> cls) {
return (T) JSON.parseObject(jsonString, cls);
}
public <T> List<T> fromJsonToList(String jsonString, Class<T> cls) {
return JSON.parseArray(jsonString, cls);
}
@Override
public String toJson(Object object) {
return JSON.toJSONString(object);
}
}
@Test
public void testJsonTool_Object() {
Knowledge knowledge = new Knowledge(0);
knowledge.setKey("gao");
knowledge.setValue("shuai");
String json = JsonTool.toJson(knowledge);
TedSDKLog.d(TAG, "testJsonTool_Object: " + json);
Knowledge knowledge1 = JsonTool.fromJson(json, Knowledge.class);
assertEquals(knowledge.getKey(), knowledge1.getKey());
}
@Test
public void testJsonTool_Arraylist() {
Knowledge knowledge = new Knowledge(0);
knowledge.setKey("gao");
knowledge.setValue("shuai");
List<Knowledge> list = new ArrayList<>();
list.add(knowledge);
list.add(knowledge);
String json = JsonTool.toJson(list);
TedSDKLog.d(TAG, "testJsonTool_Arraylist: " + json);
List<Knowledge> knowledge1 = JsonTool.fromJson(json);
assertEquals(list.size(), knowledge1.size());
}
@Test
public void testJsonTool_Map() {
Knowledge knowledge = new Knowledge(0);
knowledge.setKey("gao");
knowledge.setValue("shuai");
Knowledge knowledge2 = new Knowledge(0);
knowledge2.setKey("gao2");
knowledge2.setValue("shuai2");
Map<String, String> map = new HashMap();
map.put(knowledge.getKey(), knowledge.getValue());
map.put(knowledge2.getKey(), knowledge2.getValue());
String json = JsonTool.toJson(map);
TedSDKLog.d(TAG, "testJsonTool_Map: " + json);
Map<String, String> map1 = JsonTool.fromJson(json);
assertEquals(map.get("gao"), map1.get("gao"));
}