gson 将JSON字符串反序列化为 Package 泛型类的类

bhmjp9jg  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(207)

先说一下背景。
我有一个 Package 类:

  1. public class ResponseEntity<T> {
  2. private String code;
  3. private String message;
  4. private T data;
  5. public ResponseEntity(String code, String message, T data) {
  6. this.code = code;
  7. this.message = message;
  8. this.data = data;
  9. }
  10. public ResponseEntity(String code, String message) {
  11. this.code = code;
  12. this.message = message;
  13. this.data = null;
  14. }
  15. ...getters...
  16. }

然后我有我在里面使用的类:

  1. public class Foo {
  2. private String name;
  3. private String age;
  4. public Foo(String name, String age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. ...getters...
  9. }

我使用AWS Lambda,因此ResponseEntity在AWS Lambda响应类内的body字段中序列化:some-lambda-handler-class.java

  1. public APIGatewayProxyResponseEvent handleRequest(String name, String age) {
  2. Foo foo = new Foo(name, age);
  3. ResponseEntity<Foo> fooResponse = new ResponseEntity("code", "msg", foo);
  4. String body = gson.toJson(fooResponse);
  5. APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
  6. response.setBody(body);
  7. return response;
  8. }

问题是当我测试我的处理程序类时:some-lambda-handler-class-test.java

  1. @Test
  2. public void test() {
  3. APIGatewayProxyResponseEvent response = myHandler.handleRequest("foo", "bar");
  4. ResponseEntity<Foo> fooResponse = gson.fromJson(response.getBody(), ResponseEntity.class);
  5. assertThat(fooResponse.getCode(), is("code")); // This assert is Ok
  6. assertThat(fooResponse.getMessage(), is("msg")); // This assert is Ok
  7. assertThat(fooResponse.getData().getName(), is("foo")); // this throws an error
  8. // Error is: java.lang.ClassCastException: class com.google.gson.internal.LinkedTreeMap cannot be cast to class Foo (com.google.gson.internal.LinkedTreeMap and Foo are in unnamed module of loader 'app')
  9. assertThat(fooResponse.getData().getAge(), is("bar"));
  10. }

我从这个错误中了解到,我必须以某种方式告诉gson,我想从json反序列化的类是ResponseEntity<Foo>.class,所以不要使用LinkedTreeMap作为data字段,而要使用Foo
但我不知道怎么做。因为如果我做了:

  1. ResponseEntity<Foo> fooResponse = gson.fromJson(response.getBody(), ResponseEntity<Foo>.class);
  2. // The "ResponseEntity<Foo>.class" part shows an error ("Cannot select from parameterized type")

所以问题是

如何让Gson将JSON字符串反序列化为ResponseEntity<Foo>类?

先谢谢你。

lvjbypge

lvjbypge1#

您必须使用

  1. gson.fromJson(response.getBody(), new TypeToken<ResponseEntity<Foo>>() {}.getType());

因为您使用了 Package 类

  1. ResponseEntity<Foo>.class

不可能,因为.class忽略〈〉参数

相关问题