使用jackson将Map转成Json字符串

这里主要是用

com.fasterxml.jackson.databind.ObjectMapper 类里面的
   @SuppressWarnings("resource")
    public String writeValueAsString(Object value) throws JsonProcessingException

例如:

    Map<String,String> map = new HashMap<String,String>();
    ObjectMapper objectMapper = new ObjectMapper();
    map.put("b", "b");
    map.put("a", "a");
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    map.put("occurTime", sdf.format(new Date()));
    System.out.println("print map: " + map); 
    String jsonStr = objectMapper.writeValueAsString(map);
    System.out.println("print json: " + jsonStr); 

这里生成的Json String 如果对字段顺序有要求,那就不能用HashMap了,比如以b,a,occurTime的顺序put到map,结果可能会这样
print map: {occurTime=2018-03-07 09:46:46, b=b, a=a}
print json: {“occurTime”:”2018-03-07 09:46:46”,”b”:”b”,”a”:”a”}

所以Jackson对map的遍历,应该是跟map存储数据的方式有关,那么顺序改变也就很正常了。

看看writeValueAsString这个方法:

protected final void _configAndWriteValue(JsonGenerator g, Object value)
        throws IOException
    {
        SerializationConfig cfg = getSerializationConfig();
        cfg.initialize(g); // since 2.5
        if (cfg.isEnabled(SerializationFeature.CLOSE_CLOSEABLE) && (value instanceof Closeable)) {
            _configAndWriteCloseable(g, value, cfg);
            return;
        }
        try {
            _serializerProvider(cfg).serializeValue(g, value);
        } catch (Exception e) {
            ClassUtil.closeOnFailAndThrowAsIAE(g, e);
            return;
        }
        g.close();
    }

里面用到_serializerProvider(cfg).serializeValue(g, value);对对象进行序列化操作,一直跟踪进去:
这里写图片描述

到了class MapSerializer的
public void serializeFields(Map<?,?> value, JsonGenerator gen, SerializerProvider provider)
        throws IOException

这里写图片描述

很明显,构造json串时是用entrySet遍历的,所以构造的顺序与遍历map的顺序一致
试试LinkedHashMap:

Map<String,String> map = new LinkedHashMap<String,String>();

{b=b, a=a, occurTime=2018-03-07 09:42:32}
{“b”:”b”,”a”:”a”,”occurTime”:”2018-03-07 09:42:32”}
LinkedHashMap按照put的顺序存储

再试试TreeMap:

Map<String,String> map = new TreeMap<String,String>();

print map: {a=a, b=b, occurTime=2018-03-07 09:46:28}
print json: {“a”:”a”,”b”:”b”,”occurTime”:”2018-03-07 09:46:28”}

TreeMap是有序的,这时构造出来的json也是有序的了。

所以jackson构造map对应的json串,跟map本身存储数据的方式有关,仍然是用entrySet遍历的。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值