Десериализация объектов JSON с помощью Nested Map, Java Spring - PullRequest
0 голосов
/ 30 ноября 2018

Из того, что я искал и нашел, это очень хорошо, возможно, будет невозможно, но любая помощь будет оценена.

У меня есть контроллер пружины, который принимает созданное мной DTO, и один из атрибутов - этоКарта.На моей html-странице я пытаюсь связать карту со страницы в JSON, но единственный способ сделать это - преобразовать карту в массив.Это приводит к сбою десериализации из-за несовместимых типов.

EG

Контроллер:

@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 превращает карту в просто: {}, я знаю, что это ожидаемое поведение.

Есть ли в любом случае, я могу изменить это, чтобы заставить его делать то, что я хотел быкак это?

РЕДАКТИРОВАТЬ: Это результат stringify с Array.from ()

"{
  //values
  "map":[["0","value"],["1","another value"],["2","third value"]], 
  //more values
 }"

И, как я упоминал выше, если я просто использую "map": mapтогда результирующий разбор будет "map": {}

1 Ответ

0 голосов
/ 01 декабря 2018

Я просто немного подумал о твоей проблеме.Мы не можем правильно сериализовать JS Map() ( Проблемы с сериализацией карты 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 выглядит такthis:

'{"id":1,"map":{"1":"val1","2":"val2","3":"val3"},"otherProperty":"otherValue"}'

А этот можно анализировать для DTO с HashMap<Integer, String> map внутри.Попробуйте, пожалуйста, и дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...