Десериализация объектов JSON с помощью Nested Map, Java Spring

1

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

У меня есть контроллер весны, который принимает 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 делает карту просто: {}, которую я знаю, является ожидаемым поведением.

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

EDIT: Это результат строки с помощью Array.from()

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

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

  • 2
    Пожалуйста, опубликуйте, как выглядит ваш JSON.
  • 0
    Похоже, у вас есть ключ как строка в JSON, но вы пытаетесь присвоить его Map <Integer, String>
Показать ещё 6 комментариев
Теги:
spring-boot
spring

1 ответ

0

Я просто немного подумал о вашей проблеме. Мы не можем корректно сериализовать 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 выглядит следующим образом:

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

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

  • 0
    Огромное спасибо! Это решило проблему. Я не думал, что просто использование объекта отобразит правильно, но это так. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню