使用Jackson的Map器将我的响应转换为List时< Object>,出现错误

w8biq8rn  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(213)

现在,我有一个方法

public <T> ResponseEntity<List<T>> getProduct(String resource, Map<String, String> queryParams)
      throws Exception {
   return getRestTemplate().exchange(endpointAddress + resource, HttpMethod.GET, new HttpEntity(createHeaders()),
         new ParameterizedTypeReference<List<T>>(){}, queryParams);
}

当我在我的Adapter类中调用这个方法ResponseEntity<List<Product>> myProduct = myServer.getProduct("someURL", myQuery)时,它工作得很好。如果我调用LOG.debug()这个response.getBody().toString(),我会得到类似<200,[{name="Terry", ID=4234, City="Dallas"}]>的东西。我的Product类有getName()getID()这样的方法。我不能简单地做response.getBody().get(0).getID(),因为Jackson不知道我使用的对象类型。我试过做:

ObjectMapper mapper = new ObjectMapper();
List<Product> product = mapper.convertValue(response.getBody(), new TypeReference<List<Product>>() {});

另一方面,我可以将主体转换为json

String json = mapper.writeValueAsString(wlsProduct.getBody().get(0));

并解析它以获得响应,但我更愿意使用Product类中的方法。
编辑:我得到的错误是java.lang.ClassCastException

6jygbczu

6jygbczu1#

myServer.getProduct("someURL", myQuery)不会返回Product的列表,而是返回LinkedHashMap的列表。您可能会得到java.lang.ClassCastException(下次您应该在问题中指定异常,这样我们就不必进行假设)。
一旦您将getProduct方法更改为如下所示,您的代码应该可以按预期方式工作:

public ResponseEntity<List<Product>> getProduct(String resource, Map<String, String> queryParams)
    throws Exception {
    return getRestTemplate().exchange(endpointAddress + resource, HttpMethod.GET, new HttpEntity(createHeaders()),
        new ParameterizedTypeReference<List<Product>>(){}, queryParams);
}

为什么是泛型?你的getProduct()似乎是特定于Produt的。

j13ufse2

j13ufse22#

你的身体看起来像<200,[valid JSON content]>,所以从你的身体删除“200,”在hte开始和“〉”在结束,你应该很好
要从Json字符串读取到对象,请执行以下操作:

data = objectReader.forType(type).readValue(jsonString);

其中data是类的一个示例-Product,type是类的一个示例。我猜应该是Product.class。但是对于列表,它有点问题。您可以将Json读为List<Map>>,然后运行列表并将每个Map转换为Person示例

相关问题