当我从@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 configuration

它提供了有关如何配置默认映射器或使用自定义映射器的说明。

如果要完全替换默认的ObjectMapper,请定义该类型的@Bean并将其标记为@Primary ...

因此我认为你错过了@Primary注释

以上是关于当我从@RestControler返回对象时,如何在json中保持映射键顺序的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 - 从 RestControler 返回 rx.Observable

当我从 UITableViewController 打开自定义 UIView 时,如何关闭自定义视图并返回表格视图?

当我从数据库/模型中删除对象时,如何让 Django Admin 删除文件?

在带有 react-router 的 React 中,当我从一个复杂的视图中导航出来,然后直接返回时,如何保留一个人的所有视图选择?

将 PHP 数组转换为对象的 JSON 数组

当我从等待移动到 Promise.all 时,TypeScript 函数返回类型错误