Spring Boot JSON到对象的转换

xcitsw88  于 2023-01-20  发布在  Spring
关注(0)|答案(1)|浏览(433)

我正在用Java开发一个微服务项目,使用Sping Boot 和Eureka 。我遇到了这样一个场景,我使用-

List<Rating> ratings=(List<Rating>) restTemplate.getForObject("http://localhost:8083/microservices/rating/get-all-ratings-by-user?userId=ddb8e2a9-ac6f-460d-a43e-eae23d18450c", Map.class).get("data");

我在这条线上收到警告-

**说明-**我从上面使用的URL得到以下响应-

{
    "data": [
        {
            "ratingId": "6140b240-9a97-430d-92b9-0fcfa8edc96f",
            "userId": "ddb8e2a9-ac6f-460d-a43e-eae23d18450c",
            "hotelId": "1093aa3f-8529-4330-8ce8-caa82546200b",
            "rating": 4,
            "feedback": "Died peacefully"
        }
    ],
    "message": "Success",
    "code": "2000"
}

目标-我希望从响应的data字段中提取Rating对象的列表,并将其存储为List。此外,我希望对其进行迭代并执行其他操作。

1.我将它转换为一个Map(在getForObject()方法中传递的Map.class)。
1.我使用**.get(“data”)获得类型Map的列表。**
1.这是转换为**List**的类型。

我的问题-

使用上述方法,我能够获得Rating类的对象列表。但是,有人能解释**如何使用此Map吗(使用.get(“data”)获得)使用简单的类型转换自动转换为List?**代码似乎没有使用任何像Jackson这样的对象Map器。此外,我收到了一个警告。有什么方法可以删除它吗?我可以将列表原样发送到GET请求。

但如果我尝试使用列表上的方法,我会得到错误-
跟进-

1.我尝试在上面获得的List中使用stream()和map(),但是得到了一个错误-

ratings=ratings.stream().map(rating->{
            //api call to hotel service to obtain the hotel
            Hotel hotel=(Hotel) restTemplate.getForEntity("http://localhost:8086/microservices/hotel/get-hotel-by-id?hotelId="+rating.getHotelId(), Map.class).getBody().get("data");
            logger.info("fetched hotel: ", hotel);
            rating.setHotel(hotel);
        }).collect(Collectors.toList());

**.map()**上出现编译时错误-

1.forEach()给出类转换异常-

ratings.forEach((rating)->{
            //api call to hotel service to obtain the hotel
            Hotel hotel=(Hotel) restTemplate.getForEntity("http://localhost:8086/microservices/hotel/get-hotel-by-id?hotelId="+rating.getHotelId(), Map.class).getBody().get("data");
            logger.info("fetched hotel: ", hotel);
            rating.setHotel(hotel);
      });

forEach()上出错-

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.example.user_service.entities.Rating (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.example.user_service.entities.Rating is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @db2af5f)
        at java.base/java.util.ArrayList.forEach(Unknown Source) ~[na:na]
        at com.example.user_service.ServiceImpl.UserServiceImpl.getUser(UserServiceImpl.java:84) ~[classes/:na]
        at com.example.user_service.controller.UserController.getUserById(UserController.java:53) ~[classes/:na]
watbbzwu

watbbzwu1#

你的任务太复杂了,你可以把json响应从RestTemplate转换成String值,然后用Jackson库提取其中的 data 部分,如下所示:

JsonNode root =mapper.readTree(json); //<--convert the json string to a JsonNode
JsonNode data = root.at("/data"); //<-- selecting the "data" part
//conversion to List<Rating> avoid problems due to list type erasure
//with the help of jackson TypeReference class
List<Rating> ratings = mapper.convertValue(data, new TypeReference<List<Rating>>() {});

这是使用JsonNode#at方法实现的,该方法在json中定位带有 data 标签的特定节点,要将其转换为List<Rating>,必须使用TypeReference示例化对泛型类型List<Rating>的引用。

相关问题