Index: forgon-tools/src/main/java/com/forgon/Constants.java =================================================================== diff -u -r24667 -r24717 --- forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 24667) +++ forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 24717) @@ -48,6 +48,7 @@ public final static String DATE_ADJUSTTYPE_END = "END"; public final static String DATE_ADJUSTTYPE_START = "START"; + public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMMDDHHMMSS_SSS = new SimpleDateFormat(DATEFORMAT_YYYYMMDDHHMMSS_SSS); public final static SimpleDateFormat SIMPLEDATEFORMATNOSPLIT_YYYYMMDDHHMMSS = new SimpleDateFormat( "yyyyMMddHHmmss"); public final static SimpleDateFormat SIMPLEDATEFORMAT_YYYYMMDDHHMMSS = new SimpleDateFormat( Index: forgon-tools/src/main/java/com/forgon/tools/json/JSONUtil.java =================================================================== diff -u -r24389 -r24717 --- forgon-tools/src/main/java/com/forgon/tools/json/JSONUtil.java (.../JSONUtil.java) (revision 24389) +++ forgon-tools/src/main/java/com/forgon/tools/json/JSONUtil.java (.../JSONUtil.java) (revision 24717) @@ -36,10 +36,13 @@ import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module; +import com.forgon.Constants; import com.forgon.annotations.GsonIgnore; import com.forgon.tools.adapter.DoubleDefaultNullAdapter; import com.forgon.tools.adapter.IntegerDefaultNullAdapter; @@ -81,8 +84,54 @@ private static ObjectMapper disableAnnotationsMapper; - private static SimpleDateFormat defaultDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - + /** + * 公共的reader和writer + */ + private static final ObjectMapper commonMapper; + private static final ObjectWriter commonWriter; + + static{ + + commonMapper = new ObjectMapper(); + //commonMapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); + commonMapper.setVisibility(PropertyAccessor.FIELD, Visibility.NONE); + + commonMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + + Hibernate4Module hbm = new Hibernate4Module(); + // 默认hibernate模块不会序列化Transient类型的field,所以禁用transient的注解 + hbm.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); + commonMapper.registerModule(hbm); + // 使用精确格式年月日 时分秒.毫秒 + commonMapper.setDateFormat(Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS_SSS); + // 不使用注解, + commonMapper.disable(MapperFeature.USE_ANNOTATIONS); + // 不自动检测属性,强制使用getter + commonMapper.disable(MapperFeature.AUTO_DETECT_FIELDS); + // 使用标准的bean命名规则 + commonMapper.enable(MapperFeature.USE_STD_BEAN_NAMING); + // 将null值转换为空字符串 + commonMapper.getSerializerProvider().setNullValueSerializer( + new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator jgen, + SerializerProvider provider) throws IOException, + JsonProcessingException { + jgen.writeString(""); + } + }); + + commonWriter = commonMapper.writer(); + } + + public static ObjectNode createObjectNode(){ + return commonMapper.createObjectNode(); + } + + public static ArrayNode createArrayNode(){ + return commonMapper.createArrayNode(); + } + private static final ExclusionStrategy excludeStrategy = ExclusionStrategyHolder.getExclusionStrategy(); private static ObjectMapper getObjectMapper(boolean useAnnotations) { @@ -115,7 +164,7 @@ mapper.registerModule(hbm); - mapper.setDateFormat(defaultDateFormat); + mapper.setDateFormat(Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS); if (!useAnnotations) { mapper.disable(MapperFeature.USE_ANNOTATIONS); @@ -155,7 +204,124 @@ return jsonString; } + + public static String toJSONString(Object object) { + return toJSONObject(object, null, null).toString(); + } + public static String toJSONStringWithInclude(Object object, + String[] includeProperties) { + return toJSONObject(object, includeProperties, null).toString(); + } + public static String toJSONStringWithExclude(Object object, + String[] excludeProperties) { + return toJSONObject(object, null, excludeProperties).toString(); + } + // to JSONObject + public static JSONObject toJSONObject(Object object) { + return toJSONObject(object, null, null); + } + public static JSONObject toJSONObjectWithInclude(Object object, + String[] includeProperties) { + return toJSONObject(object, includeProperties, null); + } + public static JSONObject toJSONObjectWithExclude(Object object, + String[] excludeProperties) { + return toJSONObject(object, null, excludeProperties); + } + + // to JSONArray + public static JSONArray toJSONArray(Object object) { + return toJSONArray(object, null, null); + } + public static JSONArray toJSONArrayWithInclude(Object object, + String[] includeProperties) { + return toJSONArray(object, includeProperties, null); + } + public static JSONArray toJSONArrayWithExclude(Object object, + String[] excludeProperties) { + return toJSONArray(object, null, excludeProperties); + } + // 构造jsonConfig + public static JsonConfig buildJsonConfig(String[] includeProperties, String[] excludeProperties) { + JsonConfig config = new JsonConfig(); + // 这段代码可以解决Integer、Double类型的被默认转换为0的问题,这样null将替换0成为默认转换值.其它类型的设置类似. + config.registerDefaultValueProcessor(Integer.class, + new DefaultValueProcessor() { + @Override + public Object getDefaultValue(Class type) { + return JSONNull.getInstance(); + } + }); + config.registerDefaultValueProcessor(Double.class, + new DefaultValueProcessor() { + @Override + public Object getDefaultValue(Class type) { + return JSONNull.getInstance(); + } + }); + config.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(Constants.DATEFORMAT_YYYYMMDDHHMMSS)); + JsonPropertyFilter propertyFilter = new JsonPropertyFilter(); + propertyFilter.setIncludeProperties(includeProperties); + propertyFilter.setExcludeProperties(excludeProperties); + config.setJsonPropertyFilter(propertyFilter); +// config.setExcludes(excludeProperties); //这个方法也是过滤, + config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); + return config; + } + // json-lib实现 + public static String toJSONStringEx(Object object, + String[] includeProperties, String[] excludeProperties) { + JsonConfig config = buildJsonConfig(includeProperties,excludeProperties); + JSONObject jsonObject = JSONObject.fromObject(object, config); + return jsonObject.toString(); + } + public static JSONObject toJSONObject(Object object, + String[] includeProperties, String[] excludeProperties) { + JsonConfig config = buildJsonConfig(includeProperties,excludeProperties); + JSONObject jsonObject = JSONObject.fromObject(object, config); + return jsonObject; + } + public static JSONArray toJSONArray(Object object, + String[] includeProperties, String[] excludeProperties) { + JsonConfig config = buildJsonConfig(includeProperties,excludeProperties); + JSONArray jsonArray = JSONArray.fromObject(object, config); + return jsonArray; + } + // jackson实现 +// public static String toJSONStringEx(Object object, +// String[] includeProperties, String[] excludeProperties) { +// String jsonString = null; +// +// SimpleFilterProvider filterProvider = null; +// if (ArrayUtils.isNotEmpty(includeProperties)) { +// filterProvider = new SimpleFilterProvider(); +// filterProvider.addFilter("includeFieldFilter", +// SimpleBeanPropertyFilter +// .filterOutAllExcept(includeProperties)); +// } +// if (ArrayUtils.isNotEmpty(excludeProperties)) { +// if (filterProvider == null) { +// filterProvider = new SimpleFilterProvider(); +// } +// filterProvider.addFilter("excludeFieldFilter", SimpleBeanPropertyFilter +// .serializeAllExcept(excludeProperties)); +// } +// +// try { +// if(filterProvider == null){ +// jsonString = commonWriter.writeValueAsString(object); +// }else{ +// ObjectWriter writer = commonMapper.writer(filterProvider); +// jsonString = writer.writeValueAsString(object); +// } +// } catch (JsonProcessingException e) { +// e.printStackTrace(); +// throw new SystemException(e.getMessage()); +// } +// return jsonString; +// } + public static String toJSONString(Object object, boolean useAnnotations, String[] includeProperties){ String jsonString = null;