簡單封裝Jackson,實現JSON String到Java Object的Mapper.
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
/**
* 簡單封裝Jackson,實現JSON String<->Java Object的Mapper.
*
* 封裝不同的輸出風格, 使用不同的builder函式建立例項.
*
*/
public class JsonMapper {
private static Logger logger = LoggerFactory.getLogger(JsonMapper.class); private ObjectMapper mapper; public JsonMapper() { this(null); } public JsonMapper(Include include) { mapper = new ObjectMapper(); // 設定輸出時包含屬性的風格 if (include != null) { mapper.setSerializationInclusion(include); } // 設定輸入時忽略在JSON字串中存在但Java物件實際沒有的屬性 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } /** * 建立只輸出非Null且非Empty(如List.isEmpty)的屬性到Json字串的Mapper,建議在外部介面中使用. */ public static JsonMapper nonEmptyMapper() { return new JsonMapper(Include.NON_EMPTY); } /** * 建立只輸出初始值被改變的屬性到Json字串的Mapper, 最節約的儲存方式,建議在內部介面中使用。 */ public static JsonMapper nonDefaultMapper() { return new JsonMapper(Include.NON_DEFAULT); } /** * Object可以是POJO,也可以是Collection或陣列。 * 如果物件為Null, 返回"null". * 如果集合為空集合, 返回"[]". */ public String toJson(Object object) { try { return mapper.writeValueAsString(object); } catch (IOException e) { logger.warn("write to json string error:" + object, e); return null; } } /** * 反序列化POJO或簡單Collection如List<String>. * * 如果JSON字串為Null或"null"字串, 返回Null. * 如果JSON字串為"[]", 返回空集合. * * 如需反序列化複雜Collection如List<MyBean>, 請使用fromJson(String, JavaType) * * @see #fromJson(String, JavaType) */ public <T> T fromJson(String jsonString, Class<T> clazz) { if (StringUtils.isEmpty(jsonString)) { return null; } try { return mapper.readValue(jsonString, clazz); } catch (IOException e) { logger.warn("parse json string error:" + jsonString, e); return null; } } /** * 反序列化複雜Collection如List<Bean>, 先使用createCollectionType()或contructMapType()構造型別, 然後呼叫本函式. * * @see #createCollectionType(Class, Class...) */ @SuppressWarnings("unchecked") public <T> T fromJson(String jsonString, JavaType javaType) { if (StringUtils.isEmpty(jsonString)) { return null; } try { return (T) mapper.readValue(jsonString, javaType); } catch (IOException e) { logger.warn("parse json string error:" + jsonString, e); return null; } } /** * 構造Collection型別. */ @SuppressWarnings("rawtypes") public JavaType contructCollectionType(Class<? extends Collection> collectionClass, Class<?> elementClass) { return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass); } /** * 構造Map型別. */ @SuppressWarnings("rawtypes") public JavaType contructMapType(Class<? extends Map> mapClass, Class<?> keyClass, Class<?> valueClass) { return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); } /** * 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性. */ public void update(String jsonString, Object object) { try { mapper.readerForUpdating(object).readValue(jsonString); } catch (JsonProcessingException e) { logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); } catch (IOException e) { logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); } } /** * 輸出JSONP格式資料. */ public String toJsonP(String functionName, Object object) { return toJson(new JSONPObject(functionName, object)); } /** * 設定是否使用Enum的toString函式來讀寫Enum, * 為False時時使用Enum的name()函式來讀寫Enum, 預設為False. * 注意本函式一定要在Mapper建立後, 所有的讀寫動作之前呼叫. */ public void enableEnumUseToString() { mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); } /** * 支援使用Jaxb的Annotation,使得POJO上的annotation不用與Jackson耦合。 * 預設會先查詢jaxb的annotation,如果找不到再找jackson的。 */ public void enableJaxbAnnotation() { JaxbAnnotationModule module = new JaxbAnnotationModule(); mapper.registerModule(module); } /** * 取出Mapper做進一步的設定或使用其他序列化API. */ public ObjectMapper getMapper() { return mapper; }
}