javascript - JSON对象反序列化与嵌套映射,Java 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":{}
解决方案
我只是想了一下你的问题。我们无法Map()
正确序列化 JS(JS 映射序列化问题),所以我的介词是这样更改您的代码:
...
var map = {}; // using object instead of map
$("#mapBody tr").map(function () {
var value = $(this).find( "input[name=value]").val();
var index = $(this).find("input[name=index]").val();
map[index] = value; // setting property of object
});
...
var data = {
//other values
"map": map, // using map object instead of array
//Some more values
}
...
$.ajax({
url: "/mapping",
type: "POST",
data: JSON.stringify(data),
...
});
因此生成的 JSON 如下所示:
'{"id":1,"map":{"1":"val1","2":"val2","3":"val3"},"otherProperty":"otherValue"}'
而这个可以解析为HashMap<Integer, String> map
内部的 DTO。请尝试一下,让我知道它是否有效。
推荐阅读
- html - svg:一个 svg 渐变与页面上的另一个 svg 重叠
- python - 尝试在 Jupyter Notebook 中读取文件时未找到 CSV 文件错误
- amazon-web-services - 如何返回到 AWS Amplify CLI 身份验证配置中的上一个项目?
- flutter - 在颤动中,图像高度没有适合其父小部件
- tkinter - Tkinter、cx_freeze 和 PyCharm
- ios - 在 iOS 15 上生成带有主题和正文的电子邮件二维码
- flutter - flutter UniqueKey 转换为另一种类型的数据 sqflite
- python - 覆盖 Django 中的保存和清理方法
- c++ - 初始化字符串向量
- azure - Azure App Service 将数据库从主数据库切换到辅助数据库,反之亦然