Gson 问题:无法将 List<String> 响应映射到 Pojo class
Gson Issue : Cannot map List<String> response to the Pojo class
我有一个基于微服务的架构。我的一项服务调用另一项服务 api,并且大多数情况下我们共享响应 class 对象,这使得使用 gson.fromJson
方法映射变得容易。
现在,我遇到的问题是,从其中一个微服务 api,我在父服务中得到的响应是 List<String>
类型的。父服务响应 pojo class 格式如下:
public class ParentResposneClass {
private List<String> list;
//getter-setter etc
}
父api调用代码如下(删除了不必要的部分):
CloseableHttpResponse response = closeableHttpClient.execute(postRequest);
String jsonResponse = EntityUtils.toString(response.getEntity(),StandardCharsets.UTF_8.name());
Logger.info(jsonResponse); // ["first","second"]
- 问题 1
现在,如果我想将 json 响应映射到我的 pojo 响应 class ParentResposneClass
:
gson.fromJson(jsonResponse, ParentResposneClass.class);
我收到错误:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
而且道理好像也可以理解。但我的问题是,是否可以用这种方法解决上述问题。
- 问题2
如果我不采用 gson
方式,而是直接在 ParentResposneClass
中设置列表对象:
ParentResposneClass parentResposneClass = new ParentResposneClass();
parentResposneClass.setList(convertStringToList(jsonResponse));
System.out.println(parentResposneClass.getList());
public static List<String> convertStringToList(String str) {
str = str..replaceAll("\[", "").replaceAll("\]", ""));
List<String> list = new ArrayList<String>(Arrays.asList(commaSepString.split("\s*,\s*")));
return list;
}
这将响应 (parentResposneClass.getList()
) 作为 "tag": ["\"first\"","\"second\""]
所有这些转义显示 json 编码字符串仍被保留。
那么,有没有一个好的方法可以解决这个转义字符问题,而不是直接从字符串中替换这些字符。
PS :我知道这是一个设计问题,两个微服务应该共享相同的响应 classes。但是鉴于这种情况,有没有办法解决 Problem 1
或 Problem 2
对于问题 1 我会去:
var list = gson.fromJson(jsonResponse, new TypeToken<List<String>>(){}.getType())
var prc = new ParentResponseClass()
prc.setList(list);
我曾经尝试过类似的东西。
列表结果 = gson.fromJson(jsonResponse, List.class);
ParentResposneClass parentResposneClass = new ParentResposneClass();
parentResposneClass.setList(结果);
我有一个基于微服务的架构。我的一项服务调用另一项服务 api,并且大多数情况下我们共享响应 class 对象,这使得使用 gson.fromJson
方法映射变得容易。
现在,我遇到的问题是,从其中一个微服务 api,我在父服务中得到的响应是 List<String>
类型的。父服务响应 pojo class 格式如下:
public class ParentResposneClass {
private List<String> list;
//getter-setter etc
}
父api调用代码如下(删除了不必要的部分):
CloseableHttpResponse response = closeableHttpClient.execute(postRequest);
String jsonResponse = EntityUtils.toString(response.getEntity(),StandardCharsets.UTF_8.name());
Logger.info(jsonResponse); // ["first","second"]
- 问题 1
现在,如果我想将 json 响应映射到我的 pojo 响应 class ParentResposneClass
:
gson.fromJson(jsonResponse, ParentResposneClass.class);
我收到错误:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
而且道理好像也可以理解。但我的问题是,是否可以用这种方法解决上述问题。
- 问题2
如果我不采用 gson
方式,而是直接在 ParentResposneClass
中设置列表对象:
ParentResposneClass parentResposneClass = new ParentResposneClass();
parentResposneClass.setList(convertStringToList(jsonResponse));
System.out.println(parentResposneClass.getList());
public static List<String> convertStringToList(String str) {
str = str..replaceAll("\[", "").replaceAll("\]", ""));
List<String> list = new ArrayList<String>(Arrays.asList(commaSepString.split("\s*,\s*")));
return list;
}
这将响应 (parentResposneClass.getList()
) 作为 "tag": ["\"first\"","\"second\""]
所有这些转义显示 json 编码字符串仍被保留。
那么,有没有一个好的方法可以解决这个转义字符问题,而不是直接从字符串中替换这些字符。
PS :我知道这是一个设计问题,两个微服务应该共享相同的响应 classes。但是鉴于这种情况,有没有办法解决 Problem 1
或 Problem 2
对于问题 1 我会去:
var list = gson.fromJson(jsonResponse, new TypeToken<List<String>>(){}.getType())
var prc = new ParentResponseClass()
prc.setList(list);
我曾经尝试过类似的东西。
列表结果 = gson.fromJson(jsonResponse, List.class);
ParentResposneClass parentResposneClass = new ParentResposneClass(); parentResposneClass.setList(结果);