【问题标题】:Getting specified data from Model as JSON response with annotations从模型中获取指定数据作为带有注释的 JSON 响应
【发布时间】:2019-05-05 02:05:29
【问题描述】:

我想获得带有一些注释的 JSON 响应。例如,现在我在 json 中的响应如下所示:

{
"id": 1,
"startDate": [
    1993,
    12,
    12
],
"endDate": [
    2018,
    11,
    22
],
"totalDistance": 255,
"totalPrice": 211
}

但我想从我的模型中获取选定的数据,并向它们添加注释,如单位或更改日期类型格式。这就是我希望得到的 json 响应:

{
"startDate": "December, 12th",
"totalDistance": "255 km",
"totalPrice": "211 Euros",
}

这是我的 ApiController 的一部分:

 @RequestMapping(path = "/api/reports/daily", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = "application/json")
public Reports getDailyReport1(@RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate  , @RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
    Reports reports = new Reports();
    reports.setStartDate(startDate);
    reports.setEndDate(endDate);
    reportsService.calculateTotalDistance(reports);
    reportsService.calculateTotalPrice(reports);
    return reports;
}

@GetMapping(value = "/api/reports/{id}", produces = "application/json")
public Optional<Reports> getReportsFromId(@PathVariable Long id){
    return reportsService.getReport(id);
}

@GetMapping("/api/reports")
public Collection<Reports> getAllReports(){
    return reportsService.findAllReports();
}

服务:

@Service
public class ReportsService {

@Autowired
TransitService transitService;

@Autowired
ReportsRepository reportsRepository;


public void addReports(Reports reports) {
    reportsRepository.save(reports);
}


public void calculateTotalDistance(Reports reports) {
    double totalDistance = 0.0;
    List<Transit> transits = transitService.getTransits(reports.getStartDate(), reports.getEndDate());
    for (Transit transit : transits) {
        if (transit.getDistance() != null) {
            totalDistance = totalDistance + transit.getDistance();
        }
    }
    reports.setTotalDistance((long) totalDistance);
}


public void calculateTotalPrice(Reports reports) {
    double totalPrice = 0.0;
    List<Transit> transits = transitService.getTransits(reports.getStartDate(), reports.getEndDate());
    for (Transit transit : transits) {
        if (transit.getPrice() != null) {
            totalPrice = totalPrice + transit.getPrice();
        }
    }
    reports.setTotalPrice((long) totalPrice);
}

public void addReports1(Reports reports) {
    reportsRepository.save(reports);
}



public List<Reports> findAllReports() {
    Iterable<Reports> all = reportsRepository.findAll();
    List<Reports> reports = convertReportsToList(all);
    return reports;
}

private List<Reports> convertReportsToList(Iterable<Reports> all) {
    List<Reports> reports = new ArrayList<>();
    for (Reports report : all) {
        reports.add(report);
    }
    return reports;
}

public Optional<Reports> getReport(Long id){
    return reportsRepository.findById(id);
}

}

当我将@RequestMapping(path = "/api/reports/daily") 更改为:

@RequestMapping(path = "/api/reports/daily", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = "application/json")
public String getDailyReport1(@RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate  , @RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
    Reports reports = new Reports();
    reports.setStartDate(startDate);
    reports.setEndDate(endDate);
    reportsService.calculateTotalDistance(reports);
    reportsService.calculateTotalPrice(reports);
    return "Total price" + reports.getTotalPrice + "Euros" + "Total distance" + reports.getTotalDistance + "km";

我收到来自 JSON 的响应。 J 是否应该创建 json 响应模板并在此处返回以获取我想要的信息,并带有单位等注释?感谢您的时间。希望你能理解我的想法。

【问题讨论】:

    标签: java json spring spring-mvc spring-boot


    【解决方案1】:

    假设您使用的是 Jackson,您可以根据需要添加自定义序列化程序来格式化。

    例如创建一个DistanceSerializer

    public class DistanceSerializer<T> extends StdSerializer<T> {
    
        public DistanceSerializer() {
            this(null);
        }
    
        protected DistanceSerializer(Class<T> t) {
            super(t);
        }
    
        @Override
        public void serialize(T value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeString(value + " km");
        }
    
    }
    

    并使用 DistanceSerializer 注释 totalDistance 字段

        @JsonSerialize(using=DistanceSerializer.class)
        private long totalDistance;
    

    【讨论】:

    • 谢谢你,这正是我所需要的。为了在 json 响应中获取选定的参数,我从模型中删除了不必要的 getter。我希望这是正确的解决方案。
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多