当我从@RestControler返回对象时,如何在json中保持映射键顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我从@RestControler返回对象时,如何在json中保持映射键顺序相关的知识,希望对你有一定的参考价值。
我想保持映射条目顺序,因此我将以下bean添加到上下文中:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
return objectMapper;
}
我也有以下控制器:
@Autowired
private ObjectMapper objectMapper;
@GetMapping(value = "/mapping", produces = "application/json")
public ResponseEntity<MappingDTO> getMapping(HttpServletRequest request) {
MappingDTO mappingDTO = mappingService.getMapping();
String str = objectMapper.writeValueAsString(mappingDTO); // added this line for test perpose
return ResponseEntity.ok(mappingDTO);
}
DTO:
public class MappingDTO {
private String id;
private Map<String, List<MappingEntry>> entries;
...
str
变量包含正确顺序的正确json,但是当我执行Get请求时 - 命令被破坏。
如何解决这个问题?
只需使用LinkedHashMap存储您的值,它将保持插入顺序:
@RestController
public class TestController {
class Dto {
private Map<String, List<Integer>> entries = new LinkedHashMap<>();
public Dto() {
final List<Integer> l1 = new ArrayList<>();
l1.add(2);
l1.add(1);
entries.put("A", l1);
final List<Integer> l2 = new ArrayList<>();
l2.add(4);
l2.add(6);
entries.put("C", l2);
final List<Integer> l3 = new ArrayList<>();
l3.add(5);
l3.add(3);
entries.put("B", l3);
}
public Map<String, List<Integer>> getEntries() {
return entries;
}
}
@GetMapping("json")
public ResponseEntity<Dto> getJson() {
return ResponseEntity.ok(new Dto());
}
}
对/json
的请求将导致{"entries":{"A":[2,1],"C":[4,6],"B":[5,3]}}
,但如果你使用常规的Map
,结果将是{"entries":{"A":[2,1],"B":[5,3],"C":[4,6]}}
这假设您希望保留插入顺序(从您的问题中不清楚)。但是,如果您希望按键对地图进行排序,请改用TreeMap
。
看看以下链接
它提供了有关如何配置默认映射器或使用自定义映射器的说明。
如果要完全替换默认的ObjectMapper,请定义该类型的@Bean并将其标记为@Primary ...
因此我认为你错过了@Primary注释
以上是关于当我从@RestControler返回对象时,如何在json中保持映射键顺序的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2 - 从 RestControler 返回 rx.Observable
当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?
当我从数据库/模型中删除对象时,如何让 Django Admin 删除文件?
在带有 react-router 的 React 中,当我从一个复杂的视图中导航出来,然后直接返回时,如何保留一个人的所有视图选择?