json字符串序列化后顺序问题。

Java 专栏收录该内容
6 篇文章 0 订阅

1、应用场景:如果项目中用到json字符串转为jsonObject的需求,并且,需要保证字符串的顺序转之前和转成jsonObject之后输出的结果完全一致。可能有点绕口,下面举一个应用场景的例子。

在做项目的过程中,需要写Junit单元测试,有一个方法如下:

 @Test
   @SuppressWarnings("unchecked")
   public void facilitySoftwareQueryByPageExample() throws Exception {
      facilitySoftwareRepository.deleteAll();
      FacilitySoftwareConfig facilitySoftware = createFacilitySoftware();
      facilitySoftwareRepository.save(facilitySoftware);
      String userId = "1";
      int pageNumber = 1;
      int pageSize = 5;
      String facilities = objectMapper.writeValueAsString(facilitySoftware);
      LinkedHashMap<String, Object> jsonMap = JSON.parseObject(facilities,LinkedHashMap.class, Feature.OrderedField);
      JSONArray jsonArray = new JSONArray();
      JSONObject jsonObject = new JSONObject(true);
      jsonObject.putAll(jsonMap);
      jsonArray.add(jsonObject);
      this.mockMvc
            .perform(get("/v1/facilitysoftware/userid/" + userId + "/page/" + pageNumber
                  + "/pagesize/" + pageSize + ""))
            .andExpect(status().isOk()).andExpect(jsonPath("content",is(jsonArray)))
            .andExpect(jsonPath("totalPages", is(1)))
            .andExpect(jsonPath("totalElements", is(1)))
            .andExpect(jsonPath("last", is(true)))
            .andExpect(jsonPath("number", is(0)))
            .andExpect(jsonPath("size", is(5)))
            .andExpect(jsonPath("numberOfElements", is(1)))
            .andExpect(jsonPath("first", is(true)))
            .andDo(document("facilitySoftware-query-example"));
   }
例子就在这里:
.andExpect(status().isOk()).andExpect(jsonPath("content",is(jsonArray)))

大家应该都能读懂,这行代码意思就是你用Api获取到的json字符串和你定义的字符串是否一致,一致则该条件测试通过。

这里的比较不仅仅要求所有的key和value都相同,而且需要保证两个json串的顺序完全相同,才可以完成该条件的测试。

查了资料解决途径过程如下:首先我们使用的是阿里的fastJson,需要引入fastJson的依赖,具体百度maven仓库,注意这里尽量使用稳定版本的较高版本。如 1.2.*

在解决问题过程中,遇到如下解决方案

1、在初始化json对象的时候加上参数true,这里不完全符合我们的需求,加上true之后,是让json串按照key的hashcode排序。

可以自定义升序或者降序,因为解决不了该场景的问题。这里不赘述,自行百度。

JSONObject jsonObject = new JSONObject(true);

2、解决问题,代码如下,第一个参数是需要转换的json字符串。

LinkedHashMap<String, Object> jsonMap = JSON.parseObject(facilities,LinkedHashMap.class, Feature.OrderedField);
JSONArray jsonArray = new JSONArray();
      JSONObject jsonObject = new JSONObject(true);
      jsonObject.putAll(jsonMap);
      jsonArray.add(jsonObject);




  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值