/**
* Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jfinal.json;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Json 转换 jackson 实现.
*
* json 到 java 类型转换规则: http://wiki.fasterxml.com/JacksonInFiveMinutes
* JSON TYPE JAVA TYPE
* object LinkedHashMap<String,Object>
* array ArrayList<Object>
* string String
* number (no fraction) Integer, Long or BigInteger (smallest applicable)
* number (fraction) Double (configurable to use BigDecimal)
* true|false Boolean
* null null
*/
public class Jackson extends Json {
// Jackson 生成 json 的默认行为是生成 null value,可设置此值全局改变默认行为
private static boolean defaultGenerateNullValue = true;
// generateNullValue 通过设置此值,可临时改变默认生成 null value 的行为
protected Boolean generateNullValue = null;
protected ObjectMapper objectMapper = new ObjectMapper();
public static void setDefaultGenerateNullValue(boolean defaultGenerateNullValue) {
Jackson.defaultGenerateNullValue = defaultGenerateNullValue;
}
public Jackson setGenerateNullValue(boolean generateNullValue) {
this.generateNullValue = generateNullValue;
return this;
}
/**
* 通过获取 ObjectMapper 进行更个性化设置,满足少数特殊情况
*/
public ObjectMapper getObjectMapper() {
return objectMapper;
}
public static Jackson getJson() {
return new Jackson();
}
public String toJson(Object object) {
try {
// 优先使用对象级的属性 datePattern, 然后才是全局性的 defaultDatePattern
String dp = datePattern != null ? datePattern : getDefaultDatePattern();
if (dp != null) {
objectMapper.setDateFormat(new SimpleDateFormat(dp));
}
// 优先使用对象属性 generateNullValue,决定转换 json时是否生成 null value
Boolean pnv = generateNullValue != null ? generateNullValue : defaultGenerateNullValue;
if (pnv == false) {
objectMapper.setSerializationInclusion(Include.NON_NULL);
}
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
throw e instanceof RuntimeException ? (RuntimeException)e : new RuntimeException(e);
}
}
public <T> T parse(String jsonString, Class<T> type) {
try {
return objectMapper.readValue(jsonString, type);
} catch (Exception e) {
throw e instanceof RuntimeException ? (RuntimeException)e : new RuntimeException(e);
}
}
}