使用策略模式 实现第三方Json适配接口, 快速接入FastJson Gson

策略模式(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"));
    }

 

转载于:https://my.oschina.net/sfshine/blog/2231374

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值