如何将任意名称值对列表从@RequestBody映射到java对象

jay*_*y.m 5 spring spring-mvc spring-boot

我正在使用 Spring boot mvc 构建 REST 服务。PUT 输入数据就像

[
   {
      "PERSON":"John"
   },
   {
      "PLACE":"DC"
   },
   {
      "PERSON":"John"
   },
   {
      "PERSON":"Joe"
   },
   {
      "RANDOM NAME 011":"random string"
   },
   {
      "OTHER RANDOM NAME":"John"
   }
]
Run Code Online (Sandbox Code Playgroud)

请注意,名称部分是任意的,值部分也是任意的。如何利用spring的自动转换来转换呢?我的代码就像

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody List<CategoryItem> data) {
Run Code Online (Sandbox Code Playgroud)

我知道@RequestBody List<CategoryItem> data部分不正确,我不知道如何编写 CategoryItem 类以使其工作。什么是正确的选择?

nic*_*ild 3

Object你想要什么?

由于 HTTP PUT 有效负载是,您的签名将作为List<Map<String, String>>,但说实话有点笨拙。考虑到您的密钥是随机的,检索值会特别麻烦。像这样的东西可以用于处理整组数据:

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody List<Map<String, String>> data) {
    for(final Map<String, String> map : data) {
        for(final Map.Entry<String, String> e : map.entrySet()) {
            System.out.println("Key: " + e.getKey() + " :: Value: " + e.getValue());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

就像我说的……有点笨拙。

更灵活的方法是使用 Jackson JsonDeserializer以及自定义类:

public class MyClassDeserializer extends JsonDeserializer<MyClass> {
    public abstract MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        //...
    }
}

@JsonDeserialize(using=MyClassDeserializer.class)
public class MyClass {
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器方法中使用它:

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody MyClass data) {
    //...
}
Run Code Online (Sandbox Code Playgroud)