首页 > 其他 > 详细

序列化和反序列化集合的顺序问题

时间:2021-04-11 00:30:38      阅读:203      评论:0      收藏:0      [点我收藏+]

需求是企业理赔问卷,一个问卷有一组问题,每个问题有一个编号和序号。展示的时候要按照序号展示问题,通知方发送的消息模板

  问卷名称
    问题1 序号2
    问题2 序号1
    问题3 序号3
  结束语

我们本地存了两张表,一张问卷主体,一张问题表,没有用中间表。接收消息后,将问题和对应的序号存成JSONObject(fastJson)。

BiFunction<JSONObject, SspEvaluationTemplateDetailDTO, JSONObject> function = (JSONObject map, SspEvaluationTemplateDetailDTO detailDto) -> {
    map.put(detailDto.getEvaluateTemplateDetailId(), detailDto.getSerialNo());
    return map;
};

//没有并行操作,这里直接取第一个,不需要合并
BinaryOperator<JSONObject> binaryOperator = (JSONObject map, JSONObject other) -> map;

//将评论详细按照序号排好序
JSONObject reduce = newTemplate.getEvaluateTemplateDetailList().stream().sorted(Comparator.comparing(o -> Integer.parseInt(o.getSerialNo()))).reduce(new JSONObject(true), function, binaryOperator);

问题1:集合的元素顺序问题

  fastJson的JSONObject默认是无序的,需要new JSONObject(true),指定ordered为true才行。否则即使插入有序,但是集合中的元素是无序的。

我们在问卷表一个字段存了对应关系如下:{"64": "1", "65": "2", "66": "3", "67": "4", "68": "5", "69": "6"}。Map格式key为问题ID,value为排序。存储的时候是按照序号排好顺序的。

问题2:为什么不直接只存拍好序的问题ID?

  因为可能还要用到序号,想保存这个字段。

问题3:为什么要排序?

  查询的时候,取出map的key集合,从数据库中查找并执行排序,语句如下:

select * from question_detail where id in(1,2,3) order by field(id,1,2,3);

  但是,反序列化的时候,用JSONObject去接,发现顺序又乱了。当时比较急迫,赶着上线,用了LinkedHashMap,这个是有序的。 后来发现JSONObject也可以 JSON.parseObject(a, Feature.OrderedField) 

 

序列化和反序列化集合的顺序问题

原文:https://www.cnblogs.com/walker993/p/14640412.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!