package com.jfinal.weixin.sdk.utils; import com.jfinal.json.FastJson; import com.jfinal.json.JFinalJson; import com.jfinal.json.Json; import com.jfinal.plugin.activerecord.CPI; import com.jfinal.plugin.activerecord.Model; import com.jfinal.plugin.activerecord.Record; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; /** * Json转换 * 默认使用jackson * 再次fastJson * 最后使用jsonKit * * @author L.cm * email: 596392912@qq.com * site:http://www.dreamlu.net * date 2015年5月13日下午4:58:33 */ public final class JsonUtils { private JsonUtils() {} /** * 将model转为json字符串 * @param model jfinal model * @return JsonString */ public static String toJson(Model> model) { return toJson(CPI.getAttrs(model)); } /** * 将Collection<Model>转换为json字符串 * @param models jfinal model * @return JsonString */ public static String toJson(Collection>> models) { List> list = new ArrayList>(); for (Model> model : models) { list.add(CPI.getAttrs(model)); } return toJson(list); } /** * 将 record 转为json字符串 * @param record jfinal record * @return JsonString */ public static String toJson(Record record) { return toJson(record.getColumns()); } /** * 将List<Record>转换为json字符串 * @param records jfinal records * @return JsonString */ public static String toJson(List records) { List> list = new ArrayList>(); for (Record record : records) { list.add(record.getColumns()); } return toJson(list); } // Json private static final Json json; static { Json jsonToUse = null; // com.fasterxml.jackson.databind.ObjectMapper? if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", JsonUtils.class.getClassLoader())) { jsonToUse = new Jackson(); } // com.alibaba.fastjson.JSONObject? else if (ClassUtils.isPresent("com.alibaba.fastjson.JSONObject", JsonUtils.class.getClassLoader())) { jsonToUse = new FastJson(); } // JFinalJson else { jsonToUse = new JFinalJson(); } json = jsonToUse; } /** * 解决微信特殊字符的乱码 */ private static class Jackson extends Json { private final com.fasterxml.jackson.databind.ObjectMapper objectMapper; public Jackson() { this.objectMapper = new com.fasterxml.jackson.databind.ObjectMapper(); this.objectMapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); this.objectMapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true); } @Override public String toJson(Object object) { try { return objectMapper.writeValueAsString(object); } catch (Exception e) { throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e); } } @Override public T parse(String jsonString, Class type) { try { return objectMapper.readValue(jsonString, type); } catch (Exception e) { throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e); } } } /** * 将 Object 转为json字符串 * @param object 对象 * @return JsonString */ public static String toJson(Object object) { if (json == null) { throw new RuntimeException("Jackson, Fastjson or JFinalJson not supported"); } return json.toJson(object); } /** * 将 json字符串 转为Object * @param jsonString json字符串 * @param valueType 结果类型 * @param 泛型标记 * @return T 结果 */ public static T parse(String jsonString, Class valueType) { if (json == null) { throw new RuntimeException("Jackson, Fastjson not supported"); } return json.parse(jsonString, valueType); } }