Gson问题:无法将列表响应Map< String>到Pojo类

nlejzf6q  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(167)

我有一个基于微服务的架构,我的一个服务调用另一个服务API,并且我们大多数时候共享响应类对象,这使得使用gson.fromJson方法Map变得容易。
现在,我遇到的问题是,从一个微服务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

现在,如果我想将jsonResponseMap到我的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中设置list对象:

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:我知道这是一个设计问题,两个微服务应该共享相同的响应类。

vwoqyblh

vwoqyblh1#

对于问题1,我会说:

var list = gson.fromJson(jsonResponse, new TypeToken<List<String>>(){}.getType())
var prc = new ParentResponseClass()
prc.setList(list);
j5fpnvbx

j5fpnvbx2#

我以前也试过类似的方法。
列表结果= gson.fromJson(jsonResponse,列表.类);
().如果是,则返回(结果);

相关问题