package com.cyou.cpush.apns.util; import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; public class JSONUtil { private static JsonParser parser = new JsonParser(); private static Gson gson = new GsonBuilder().create(); public static JsonElement toJSON(Object o) { return parser.parse(gson.toJson(o)); } public static <T> T fromJson(JsonElement json, Class<T> clazz) { return gson.fromJson(json, clazz); } public static <T> T fromJson(String json, Class<T> clazz) { return gson.fromJson(json, clazz); } public static String toJSONString(List<String> l) { String s = gson.toJson(l, new TypeToken<List<String>>() { }.getType()); return s; } public static String toJSONBoolean(List<Boolean> l) { String s = gson.toJson(l, new TypeToken<List<Boolean>>() { }.getType()); return s; } public static String toJSONInteger(List<Integer> l) { String s = gson.toJson(l, new TypeToken<List<Integer>>() { }.getType()); return s; } public static String toJSONString(String[] l) { String[] a = l; if (a == null) { a = new String[] {}; } String s = gson.toJson(a, new TypeToken<String[]>() { }.getType()); return s; } public static JsonArray arrayFromString(String s) { if (isBlank(s)) return null; try { JsonElement e = parser.parse(s); if (e.isJsonArray()) { return (JsonArray) e; } else { return null; } } catch (JsonParseException e1) { return null; } } public static JsonObject objectFromString(String s) { if (isBlank(s)) return null; try { JsonElement e = parser.parse(s); if (e.isJsonObject()) { return (JsonObject) e; } else { return null; } } catch (JsonParseException e1) { return null; } } public static void apply(JsonObject src, JsonObject dest) { apply(src, dest, false); } public static void apply(JsonObject src, JsonObject dest, boolean appendArray) { for (Entry<String, JsonElement> entry : src.entrySet()) { if (dest.has(entry.getKey())) { if (src.get(entry.getKey()).isJsonObject() && dest.get(entry.getKey()).isJsonObject()) { apply((JsonObject) src.get(entry.getKey()), (JsonObject) dest.get(entry.getKey()), appendArray); } else if (src.get(entry.getKey()).isJsonArray() && dest.get(entry.getKey()).isJsonArray() && appendArray) { JsonArray srcArray = src.get(entry.getKey()).getAsJsonArray(); JsonArray destArray = dest.get(entry.getKey()).getAsJsonArray(); Set<String> array = new HashSet<String>(); for (JsonElement e : destArray) { if (e.isJsonPrimitive()) { array.add(e.getAsString()); } } for (JsonElement e : srcArray) { if (e.isJsonPrimitive() && !array.contains(e.getAsString())) { destArray.add(e); } } } else { dest.add(entry.getKey(), entry.getValue()); } } else { dest.add(entry.getKey(), entry.getValue()); } } } public static void main(String[] args) { JsonObject src = new JsonObject(); src.addProperty("a", "aaa"); src.addProperty("b", "bbb"); JsonObject secSrc1 = new JsonObject(); secSrc1.addProperty("sec1-a", "src-sec1-a"); secSrc1.addProperty("sec1-b", "src-sec1-b"); JsonObject secSrc2 = new JsonObject(); secSrc2.addProperty("sec2-a", "src-sec2-a"); secSrc2.addProperty("sec2-b", "src-sec2-b"); src.add("sec1", secSrc1); src.add("sec2", secSrc2); JsonObject dest = new JsonObject(); dest.addProperty("a", "src"); dest.addProperty("c", "ccc"); JsonObject destSrc1 = new JsonObject(); destSrc1.addProperty("sec1-a", "dest-sec1-a"); destSrc1.addProperty("sec1-c", "dest-sec1-c"); dest.add("sec1", destSrc1); apply(src, dest); System.out.println(dest); } private static boolean isBlank(String s) { if (s == null || "".equals(s.trim())) { return true; } else { return false; } } }