【发布时间】:2021-03-18 18:49:40
【问题描述】:
我有一个基于微服务的架构。我的一个服务调用了另一个服务 api,并且我们大多共享响应类对象,这使得使用gson.fromJson 方法映射很容易。
现在,我遇到的问题是,从其中一个微服务 api 中,我在父服务中得到的响应是 List<String> 类型。父服务响应 pojo 类的格式如下:
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
现在,如果我想将 jsonResponse 映射到我的 pojo 响应类 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:我知道这是一个设计问题,两个微服务应该共享相同的响应类。但是鉴于这种情况,有没有办法解决Problem 1或Problem 2
【问题讨论】: