使用嵌套映射的 JSON 对象反序列化,Java Spring

Posted

技术标签:

【中文标题】使用嵌套映射的 JSON 对象反序列化,Java Spring【英文标题】:JSON Object Deserialization with Nested Map, Java Spring 【发布时间】: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());使它成为一个数字以便工作,但这仍然不能解决反序列化问题。 【参考方案1】:

我只是想了一下你的问题。我们不能正确序列化JSMap()(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&lt;Integer, String&gt; map 的DTO。请尝试一下,让我知道它是否有效。

【讨论】:

非常感谢!这解决了这个问题。我不认为仅使用对象会正确映射,但确实如此。再次感谢!

以上是关于使用嵌套映射的 JSON 对象反序列化,Java Spring的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的 JSON 字符串反序列化为 Java 对象

rest-assured的对象映射(序列化和反序列化)

将JSON对象反序列化为嵌套的C#对象

使用嵌套对象中的属性反序列化 JSON [重复]

在 Android Studio 中将嵌套的 JSON 反序列化为 Java

JSON.net 反序列化对象嵌套数据