如何转换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);
您可以选择两种解决方案,首先是:
- 您可以更改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,它就会工作。
- 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);