带有嵌套映射的JSON对象反序列化,Java Spring

时间:2018-11-30 16:12:00

标签: javascript java json spring spring-boot

根据我的搜索发现,这可能不太好,但会有所帮助。

我有一个spring控制器,它接受我创建的DTO,其中一个属性是Map。在我的html页面上,我试图将页面中的地图绑定到JSON中,但是我发现做到这一点的唯一方法是将地图转换为数组。由于类型不兼容,这将导致反序列化失败。

E.G。

控制器:

@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),
   ...
});

如上所述,更改为数组会使反序列化失败,但否则,字符串化会使映射变成恰好是{},我知道这是预期的行为。

无论如何,我是否可以更改此设置以使其按自己的意愿进行操作?

编辑: 这是使用Array.from()

进行字符串化的结果
"{
  //values
  "map":[["0","value"],["1","another value"],["2","third value"]], 
  //more values
 }"

就像我上面提到的,如果我只是使用“ map”:map,那么解析的结果就是“ map”:{}

1 个答案:

答案 0 :(得分:1)

我只是想了一下你的问题。我们无法正确地序列化JS Map()Problems with JS map serialization),所以我的主张是通过以下方式更改您的代码:

...
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可以解析这一点。请尝试一下,让我知道它是否有效。