【发布时间】:2019-05-02 19:42:00
【问题描述】:
根据我的搜索和发现,这可能不太可能,但我们将不胜感激。
我有一个 spring 控制器,它接受我创建的 DTO,其中一个属性是 Map。在我的 html 页面上,我试图将页面中的地图捆绑到 JSON 中,但我发现这样做的唯一方法是将地图转换为数组。由于类型不兼容,这会导致反序列化失败。
例如
控制器:
@PostMapping("/mapping")
public ResponseEntity addThing(@Validated @RequestBody Dto dto, BindingResult result){
//Do some stuff
}
Dto:
public class Dto {
...
private Map<Integer, String> map;
...
}
Javascript:
...
var map = new Map();
$("#mapBody tr").map(function () {
var value = $(this).find( "input[name=value]").val();
var index = $(this).find("input[name=index]").val();
map.set(index, value);
});
...
var data = {
//other values
"map": Array.from(map.entries()), //This is what I have found so far but
//this is what I believe needs to be changed
//Some more values
}
...
$.ajax({
url: "/mapping",
type: "POST",
data: JSON.stringify(data),
...
});
如上所述,更改为数组会使反序列化失败,但否则 stringify 会使映射变为: {} 我知道这是预期的行为。
无论如何我可以改变它来让它做我想做的事吗?
编辑: 这是使用 Array.from() 进行字符串化的结果
"{
//values
"map":[["0","value"],["1","another value"],["2","third value"]],
//more values
}"
就像我上面提到的,如果我只使用 "map":map 那么解析结果是 "map":{}
【问题讨论】:
-
请发布您的 JSON 的实际外观。
-
看起来你在 JSON 中有作为字符串的键,但你正试图将它分配给 Map
-
@vlad324 这是一个很好的观点。知道如何确保在 Array.from(map.entries()) 之后这些是整数而不是字符串吗?
-
@G.Blandin 试试这个 map.set(parseInt(index), value);没关系,愚蠢的想法
-
@vlad324 我发现使用 Number($(this).find("input[name=index]").val());使它成为一个数字以便工作,但这仍然不能解决反序列化问题。
标签: javascript java json spring spring-boot