项目需要对前端界面中展示的十多个条目字段的顺序进行调整,通过查看数据库,发现其是直接存储的一个长json字符串。因此调整该顺序,即修改数据库中json字符串中各个字段的顺序。
问题1 如何修改json字符串中属性的顺序
首先,定义一个对象ObjectEntiry,其属性按照我们希望的属性顺序排列:
// 按希望顺序写属性
privite String a;
privite String b;
privite String c;
然后我直接使用了
JSON.toJSONString(object);
但是返回的Json字符串中属性的顺序依然不是想要的顺序,因为在通过默认方法转换未json对象时是无法保证顺序的。
为了解决以上问题,可以使用ObjectMapper().writeValueAsString()方法。
JSON.toJSONString(new ObjectMapper().writeValueAsString(object))
这样返回的结果中属性顺序即为我们对象中定义的顺序。
但是此时又出现了第二个问题。
问题2 json字符串中有多个"/"
出现这个问题的原因应该和对象转换为json字符串时出现转义字符有关。于是使用了 StringEscapeUtils 来进行处理:
StringEscapeUtils.unescapeJavaScript(JSON.toJSONString(new ObjectMapper().writeValueAsString(object)));
最终,经过以上,得到了我所期望的json字符串。
问题3 SpringBoot中的单元测试
定义一个单元测试基类
定义一个单元测试的基类,是考虑到可能需要多个单元测试的类,其他类可直接继承该基类,提高代码的复用性。
这里我们要记得加上以下两个注解 @RunWith(SpringRunner.class) 以及 @SpringBootTest
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = MainApplication.class)
public class BaseTest {
}
定义一个测试类,继承自 BaseTest
public class TestModifyRecordOrder extends BaseTest {
// ...
}
关于事务
在单元测试中,SpringBoot默认是打开回滚的,就是说单元测试中对数据库的修改,默认是不生效的。但是本次我希望通过单元测试,来将数据库中数据进行修改,只在发生异常时进行回滚。所以一定要记得在单元测试的方法上添加注解 @Transactional(rollbackFor = Exception.class)
其他
在将json字符串解析为Java对象时,假如属性中具有其他对象类型,会进行自动转换。