利用Jackson对Object,Map,List,数组,枚举,日期类等转化为json

利用Jackson中的ObjectMapper对象,转为对象为json字符串,springside对Jackson的简单封装 JsonBinder :
public class JsonBinder {

    private static Logger logger = LoggerFactory.getLogger(JsonBinder.class);

    private ObjectMapper mapper;

    public JsonBinder(Inclusion inclusion) {
        mapper = new ObjectMapper();
        //设置输出包含的属性
        mapper.getSerializationConfig().setSerializationInclusion(inclusion);
        //设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
        mapper.getDeserializationConfig().set(
                org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

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

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

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

    /**
     * 如果JSON字符串为Null或"null"字符串,返回Null.
     * 如果JSON字符串为"[]",返回空集合.
     *
     * 如需读取集合如List/Map,且不是List<String>这种简单类型时使用如下语句:
     * List<MyBean> beanList = binder.getMapper().readValue(listString, new TypeReference<List<MyBean>>() {});
     */
    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;
        }
    }

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

    /**
     * 设置转换日期类型的format pattern,如果不设置默认打印Timestamp毫秒数.
     */
    public void setDateFormat(String pattern) {
        if (StringUtils.isNotBlank(pattern)) {
            DateFormat df = new SimpleDateFormat(pattern);
            mapper.getSerializationConfig().setDateFormat(df);
            mapper.getDeserializationConfig().setDateFormat(df);
        }
    }

    /**
     * 取出Mapper做进一步的设置或使用其他序列化API.
     */
    public ObjectMapper getMapper() {
        return mapper;
    }
}
在其他类中定义jsonBinder对象:
private static JsonBinder binder = JsonBinder.buildNonDefaultBinder();
以下是对象到json字符串以及json字符串到对象的转化:

/**
     * 序列化对象/集合到Json字符串.
     */
    @Test
    public void toJson() throws Exception {
        //Bean
        TestBean bean = new TestBean("A");
        String beanString = binder.toJson(bean);
        System.out.println("Bean:" + beanString);
        assertEquals("{\"name\":\"A\"}", beanString);

        //Map
        Map<String, Object> map = Maps.newLinkedHashMap();
        map.put("name", "A");
        map.put("age", 2);
        String mapString = binder.toJson(map);
        System.out.println("Map:" + mapString);
        assertEquals("{\"name\":\"A\",\"age\":2}", mapString);

        //List<String>
        List<String> stringList = Lists.newArrayList("A", "B", "C");
        String listString = binder.toJson(stringList);
        System.out.println("String List:" + listString);
        assertEquals("[\"A\",\"B\",\"C\"]", listString);

        //List<Bean>
        List<TestBean> beanList = Lists.newArrayList(new TestBean("A"), new TestBean("B"));
        String beanListString = binder.toJson(beanList);
        System.out.println("Bean List:" + beanListString);
        assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanListString);

        //Bean[]
        TestBean[] beanArray = new TestBean[] { new TestBean("A"), new TestBean("B") };
        String beanArrayString = binder.toJson(beanArray);
        System.out.println("Array List:" + beanArrayString);
        assertEquals("[{\"name\":\"A\"},{\"name\":\"B\"}]", beanArrayString);
    }

    /**
     * 从Json字符串反序列化对象/集合.
     */
    @Test
    @SuppressWarnings("unchecked")
    public void fromJson() throws Exception {
        //Bean
        String beanString = "{\"name\":\"A\"}";
        TestBean bean = binder.fromJson(beanString, TestBean.class);
        System.out.println("Bean:" + bean);

        //Map
        String mapString = "{\"name\":\"A\",\"age\":2}";
        Map<String, Object> map = binder.fromJson(mapString, HashMap.class);
        System.out.println("Map:");
        for (Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }

        //List<String>
        String listString = "[\"A\",\"B\",\"C\"]";
        List<String> stringList = binder.getMapper().readValue(listString, List.class);
        System.out.println("String List:");
        for (String element : stringList) {
            System.out.println(element);
        }

        //List<Bean>
        String beanListString = "[{\"name\":\"A\"},{\"name\":\"B\"}]";
        List<TestBean> beanList = binder.getMapper().readValue(beanListString, new TypeReference<List<TestBean>>() {
        });
        System.out.println("Bean List:");
        for (TestBean element : beanList) {
            System.out.println(element);
        }
    }

在我的实际项目中,遇到一个有意思的问题,我把一个对象转为为json字符串时,调用binder.toJson(bean) ,这个方法,方法总是返回null,后面发现该bean中没有默认的构造函数,加上某人构造函数就ok了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值