Challenge 5 Java (not easy)

  1. Đọc file json, extract lấy object mình cần rồi convert về List<POJO>
  2. Thực hiện thuật toán
  3. Print List và kết thúc
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.TypeRef;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class RangeDates {

    public static void main(String[] args) throws IOException {
        List<DateInfo> dates = getJson("$.small.ranges");
        List<DateInfo> newDates = getDateInfos(dates);
        newDates.forEach(System.out::println);

        System.out.println("----------------------");

        List<DateInfo> dates2 = getJson("$.medium.ranges");
        List<DateInfo> newDates2 = getDateInfos(dates2);
        newDates2.forEach(System.out::println);
    }

    private static List<DateInfo> getDateInfos(List<DateInfo> dates) {
      
      	//nếu list rỗng, return luôn
      	if (dates.size() == 0) {
            return Collections.emptyList();
        }
      
        for (int i = 0; i < dates.size(); i++) {
            LocalDateTime tmpStart = dates.get(i).getStart_time();
            LocalDateTime tmpEnd;
			
            //nếu i là phần tử cuối cùng thì break loop
            if (i == dates.size() - 1) {
                break;
            }
			
            /*
            So sánh 2 dates, nếu true thì 
            - set date1 = null,
            - set date2 = start của date1 và end của date 2
            */
            if (test(dates.get(i), dates.get(i+1))) {
                tmpEnd = dates.get(i+1).getEnd_time();
                dates.set(i, null);
                dates.set(i+1, new DateInfo(tmpStart, tmpEnd));
            }
        }
      
        //remove null trong list trước khi return
        return dates.stream().filter(Objects::nonNull).collect(Collectors.toList());
    }
	
   // so sánh start của date2 và end của date1
    private static boolean test(DateInfo date1, DateInfo date2) {
        LocalDateTime to1 = date1.getEnd_time();
        LocalDateTime from2 = date2.getStart_time();
        return to1.isAfter(from2) || to1.isEqual(from2);
    }

    private static List<DateInfo> getJson(String path) throws IOException {
        File json = new File("java_intermediate/src/test/resources/test.json");

        Configuration configuration = Configuration.builder()
                .jsonProvider(new JacksonJsonProvider())
                .mappingProvider(new JacksonMappingProvider())
                .build();

        List<DateInfo> dates = JsonPath.using(configuration).parse(json)
                .read(path, new TypeRef<>() {
                });

        dates.sort(Comparator.comparing(DateInfo::getStart_time));
        return dates;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class DateInfo {
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonDeserialize(using = LocalDateTimeDeserializer.class)
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        private LocalDateTime start_time;
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonDeserialize(using = LocalDateTimeDeserializer.class)
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        private LocalDateTime end_time;

        @Override
        public String toString() {
            return "DateInfo{" +
                    "start_time=" + Timestamp.valueOf(start_time) +
                    ", end_time=" + Timestamp.valueOf(end_time) +
                    '}';
        }
    }

}

Để convert từ json về list<POJO> ta cần:

  • Tạo POJO, ở đây là DateInfo
  • Tạo field cho DateInfo: LocalDateTime start_timeLocalDateTime end_time
  • Add thêm các annotation để convert String date-time về object LocalDateTime
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
  • Sử dụng thư viện JsonPath để extract json –> map về List<DateInfo>
  • Sort List<DateInfo> theo thứ tự start_time tăng dần, rồi mới return

Các thư viện cần có

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.4</version>
</dependency>
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.12.4</version>
</dependency>
5 1 vote
Đánh giá challenge
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments