`
流浪鱼
  • 浏览: 1682897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jackson简单封装

    博客分类:
  • java
 
阅读更多

 

import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.codehaus.jackson.map.util.JSONPObject;
import org.codehaus.jackson.type.JavaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 简单封装Jackson,实现JSON String<->Java Object的Mapper.
 *
 * 封装不同的输出风格, 使用不同的builder函数创建实例.
 */
public class JsonMapper {

    private static Logger logger = LoggerFactory.getLogger(JsonMapper.class);
    private ObjectMapper mapper;

    public JsonMapper(Inclusion inclusion) {
        mapper = new ObjectMapper();
        //设置输出时包含属性的风格
        mapper.setSerializationInclusion(inclusion);
        //设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //禁止使用int代表Enum的order()來反序列化Enum,非常危險
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_NUMBERS_FOR_ENUMS, true);
    }

    /**
     * 创建输出全部属性到Json字符串的Mapper.
     */
    public static JsonMapper buildNormalMapper() {
        return new JsonMapper(Inclusion.ALWAYS);
    }

    /**
     * 创建只输出非空属性到Json字符串的Mapper.
     */
    public static JsonMapper buildNonNullMapper() {
        return new JsonMapper(Inclusion.NON_NULL);
    }

    /**
     * 创建只输出初始值被改变的属性到Json字符串的Mapper.
     */
    public static JsonMapper buildNonDefaultMapper() {
        return new JsonMapper(Inclusion.NON_DEFAULT);
    }

    /**
     * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper.
     */
    public static JsonMapper buildNonEmptyMapper() {
        return new JsonMapper(Inclusion.NON_EMPTY);
    }

    /**
     * 如果对象为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;
        }
    }

    /**
     * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
     *
     * 如需读取集合如List/Map, 且不是List<String>这种简单类型时,先使用函數constructParametricType构造类型.
     *
     * @see #constructParametricType(Class, Class...)
     */
    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;
        }
    }

    /**
     * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
     *
     * 如需读取集合如List/Map, 且不是List<String>这种简单类型时,先使用函數constructParametricType构造类型.
     *
     * @see #constructParametricType(Class, Class...)
     */
    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;
        }
    }

    /**
     * 構造泛型的Type如List<MyBean>,
     * 则调用constructParametricType(ArrayList.class,MyBean.class)
     * Map<String,MyBean>则调用(HashMap.class,String.class, MyBean.class)
     */
    public JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses) {
        return mapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
    }

    /**
     * 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
     */
    public <T> T update(T object, String jsonString) {
        try {
            return (T) 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);
        }
        return null;
    }

    /**
     * 輸出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 setEnumUseToString(boolean value) {
        mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, value);
        mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, value);
    }

    /**
     * 取出Mapper做进一步的设置或使用其他序列化API.
     */
    public ObjectMapper getMapper() {
        return mapper;
    }
}

 

 

 

 

 

分享到:
评论

相关推荐

    Jackson JSON框架的Util化封装

    《让Jackson JSON生成的数据包含的中文以unicode方式编码》一文的配套代码。文章地址:http://blog.csdn.net/chaijunkun/article/details/8257209

    MVP简单封装

    本项目名为"MVP简单封装",主要目的是对MVP框架进行轻量级的封装,以方便开发者在实际项目中快速集成和使用。下面我们将详细探讨MVP架构及其在这个封装过程中的关键点。 **MVP架构介绍** MVP架构由三个核心组件组成...

    Java调用Echarts3简单封装及示例

    Java调用Echarts3简单封装及示例 在Java开发中,Echarts作为一个强大的数据可视化库,被广泛用于创建各种图表。Echarts3是Echarts的第三个主要版本,提供了丰富的图表类型、美观的视觉效果以及良好的交互性。为了在...

    jackson-annotations-2.2.3.jar(Jackson解析需引入的包)

    在标签中提到了"jar",这意味着这是一个Java Archive文件,是Java平台的标准归档格式,用于封装多个类文件和其他资源。`jackson-annotations-2.2.3.jar`需要被添加到Java项目的类路径中,以便在运行时能够访问其中的...

    json jackson 工具类

    在这个“json jackson 工具类”中,我们看到对Jackson进行了封装,以便更方便地进行字符串与JSON对象之间的转换,包括对简单对象和复杂对象的支持。 Jackson库主要由以下组件组成: 1. `...

    Jackson工具类

    最快的解析json的库 jackson 做简单的封装,似乎没有流传的那么复杂

    Java灵活易用自封装http客户端

    本主题将深入探讨如何自封装一个Java HTTP客户端,使其变得简单易用,仅需三行代码就能完成请求并处理响应。这个自封装的客户端支持JSON、XML以及键值对等多种数据传输格式,大大提升了开发效率。 首先,我们需要...

    RxJava2.0 结合Retrofit2.0 的简单的封装

    在"Demo"项目中,可能包含了具体的示例代码,展示了如何将RxJava2.0和Retrofit2.0结合使用,实现一个简单的网络请求封装。通过查看这些代码,你可以更深入地理解这两者如何协同工作,以及如何在实际项目中应用。对于...

    jackson操作json和javabean示例

    2. **Jackson工具类示例**:项目中封装好的工具类通常包含一系列静态方法,简化了常见的JSON操作。这些方法可能包括将Java对象转换为JSON字符串,从JSON字符串反序列化到Java对象,以及处理JSON片段等。例如,`...

    json封装的jar包

    标题提及的“json封装的jar包”通常是指包含有处理JSON的Java库,这类库可以帮助开发者方便地在Java程序中进行JSON对象的创建、解析、序列化和反序列化。描述中提到有6个常用的类或方法,这可能指的是这个jar包内...

    在JAVA中封装JSON数据

    这里以Jackson为例,介绍如何进行JSON数据的封装: 1. **引入依赖**:在你的项目中,需要添加Jackson的依赖。如果是Maven项目,在pom.xml中添加如下依赖: ```xml &lt;groupId&gt;...

    Android-对Retrofit的简单封装设置缓存公共参数

    总结,通过对Retrofit的简单封装,我们可以方便地管理网络请求,提高代码复用性,同时优化用户体验。在实际项目中,可以根据需求进一步扩展和定制化这些功能。通过RetrofitUtils-master这个项目,你可以更深入地学习...

    redisTemplate封装成redisUtils和分布式锁实现

    Jackson2JsonRedisSerializer&lt;Object&gt; jsonSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect....

    Android-retrofit2极简封装极简接入

    Retrofit2的主要优势在于其灵活性和强大的功能,包括支持多种网络请求方式(GET、POST等)、支持Gson、Jackson等JSON解析库以及自动管理请求回调。 为了实现极简封装,我们可以遵循以下步骤: 1. **创建基础配置**...

    Android BaseMvp 框架的封装 使用

    本篇文章将详细介绍如何在Android项目中封装一个基于BaseMvp的基础框架,并涵盖OkHttp的简单使用以及本地JSON文件的读取。 一、Android BaseMvp框架封装 1. **内存泄漏的预防**:内存泄漏是Android开发中的常见...

    volley框架的二次封装

    这通常会提供一个简单的方法来加载网络图片到ImageView: ```java MyVolley.loadImage(imageView, imageUrl); ``` 这种封装使得图片加载更加简便,同时可能会支持内存和磁盘缓存,避免频繁的网络请求。 ### 四、...

    对json格式的数据进行封装和转化,@responsebody注解所需的jar包JSON.rar

    描述中提到的"springmvc进行Jason数据封装转化时可以即使用也是@responsebody",指的是在Spring MVC的控制器(Controller)中,我们可以使用`@ResponseBody`注解配合Jackson库,实现将Java对象直接转换为JSON格式的...

    Make A Jackson-开源

    Make A Jackson 是一个很好的工具,可以帮助您设计 JSD(杰克逊结构化设计)图表。 与此程序一起,您可以为您的所有 Cobol 程序或任何其他程序语言创建一个简单、合乎逻辑的设计。

    Android-一种基于ARouter的使用封装方案实现对ARouter的Retrofit2式使用

    而本方案则旨在将ARouter与Retrofit2结合,提供一种更加便捷的使用方式,使得调用服务接口如同Retrofit2般简单。 ARouter的主要功能包括: 1. **组件化通信**:通过路径匹配,实现不同模块之间的解耦,使得各个模块...

    顺丰API接口封装

    综上所述,顺丰API接口封装的Java版本为开发者提供了便捷的物流服务集成手段,通过精心设计的接口,使得与顺丰系统的交互变得简单而高效。在实际应用中,开发者可以快速地实现下单、查询等功能,提升用户体验。

Global site tag (gtag.js) - Google Analytics