【问题标题】:Gson Issue : Cannot map List<String> response to the Pojo classGson 问题:无法将 List<String> 响应映射到 Pojo 类
【发布时间】:2021-03-18 18:49:40
【问题描述】:

我有一个基于微服务的架构。我的一个服务调用了另一个服务 api,并且我们大多共享响应类对象,这使得使用gson.fromJson 方法映射很容易。

现在,我遇到的问题是,从其中一个微服务 api 中,我在父服务中得到的响应是 List&lt;String&gt; 类型。父服务响应 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 1Problem 2

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    对于问题 1,我会去:

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

    【讨论】:

      【解决方案2】:

      我曾经尝试过类似的事情。

      列表结果 = gson.fromJson(jsonResponse, List.class);

      ParentResposneClass parentResposneClass = new ParentResposneClass(); parentResposneClass.setList(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 2014-04-12
        • 1970-01-01
        • 2018-12-27
        相关资源
        最近更新 更多