如何在java中将List<?>转换为List<Object>?



如何转换List<gt;在java中列出?

例如,我有这个类

@Data
public class Example {
private List<?> data;
}

我在这个功能中使用了

@PostMapping("/getResult")
@ResponseBody
public Result getResult(@RequestBody String json) {

Gson gson = new Gson();
Example xmpl = gson.fromJson(json, Example.class);
List<MyObject> source = (List<MyObject>)xmpl.getData(); //==> error
// get Result
return result;
}

它会给这个错误

class com.google.gson.internal.LinkedTreeMap cannot be cast to class com.myproject.MyObject

编辑:

真正的问题不在于转换?到对象,但从将LinkedTreeMap转换为对象

解决方法:

String jsonData = gson.toJson(xmpl.getData());
MyObjectBean[] objs = gson.fromJson(jsonData,MyObjectBean[].class);

您可以选择两种解决方案,首先是:

  1. 您可以更改Generic类型,这样您就不会说数据是任何集合,但它是类型为<T>的集合。现在,您可以在任何需要的地方创建具有给定类型的类

泛型值<?>通常表示您不在乎里面有什么,而且可能无论如何都不会阅读它。当您只对集合为null或其大小感兴趣时。

当您需要对它执行某些操作时,请使用泛型类型。

示例:

public class Example<T> {
private List<T> data;
}

现在,在您的控制器内部,创建一个私有类,以反序列化您的负载。

static class MyObjectExample extends Example<MyObject>{
}

现在您可以使用它来解码JSON:

MyObjectExample xmpl = gson.fromJson(json, MyObjectExample.class);
List<MyObject> source = xmpl.getData();

现在,如果您的代码可以序列化到MyObject,它就会工作。

  1. Spring也支持反序列化

如果您在Controller类中添加了@RestController注释

示例:

@PostMapping("/getResult")
public Result getResult(@RequestBody MyObjectExample xmpl) {
// get Result
return result;
}

或者你可以添加

consumes = MediaType.APPLICATION_JSON_VALUE

到您的REST方法。

尝试使用Spring为您转换值

你可以找到更多

  • GetMapping和PostMapping
  • 辅导的

真正的问题不是在转换时?到MyObject,但到MyObject的LinkedTreeMap,从这个解释通过@苛刻

所以我做了这个变通办法

String jsonData = gson.toJson(xmpl.getData());
MyObjectBean[] objs = gson.fromJson(jsonData,MyObjectBean[].class);

相关内容

最新更新