2015-07-25 24 views
8

Tôi gặp sự cố với việc tuần tự hóa json là ZonedDateTime. Khi chuyển đổi thành json, nó tạo ra một đối tượng khổng lồ và tôi không muốn tất cả dữ liệu đó được truyền đi mỗi lần. Vì vậy, tôi đã cố định dạng nó thành ISO nhưng nó không hoạt động. Làm thế nào tôi có thể làm cho nó để định dạng?Dữ liệu mùa xuân JPA - Định dạng ZonedDateTime để tuần tự hóa json

Đây là Entity Lớp tôi:

@MappedSuperclass 
public abstract class AuditBase { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @CreatedDate 
    private ZonedDateTime createdDate; 

    @LastModifiedDate 
    private ZonedDateTime lastModifiedDate; 

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
    public ZonedDateTime getLastModifiedDate() { 
     return lastModifiedDate; 
    } 

    public void setLastModifiedDate(ZonedDateTime lastModifiedDate) { 
     this.lastModifiedDate = lastModifiedDate; 
    } 

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
    public ZonedDateTime getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(ZonedDateTime createdDate) { 
     this.createdDate = createdDate; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @PrePersist 
    public void prePersist() { 
     this.createdDate = ZonedDateTime.now(); 
     this.lastModifiedDate = ZonedDateTime.now(); 
    } 

    @PreUpdate 
    public void preUpdate() { 
     this.lastModifiedDate = ZonedDateTime.now(); 
    } 
} 

Trả lời

17

Tôi đoán rằng bạn đang sử dụng Jackson cho json serialization, Jackson bây giờ có một mô-đun cho Java 8 mới API thời gian ngày, https://github.com/FasterXML/jackson-datatype-jsr310.

Thêm sự phụ thuộc này vào pom.xml của bạn

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
    <version>2.6.0</version> 
</dependency> 

Và đây là cách sử dụng của nó:

public static void main(String[] args) throws JsonProcessingException { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(new JavaTimeModule()); 
    System.out.println(objectMapper.writeValueAsString(new Entity())); 
} 

static class Entity { 
    ZonedDateTime time = ZonedDateTime.now(); 

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
    public ZonedDateTime getTime() { 
     return time; 
    } 
} 

Đầu ra là:

{"time":"2015-07-25T23:09:01.795+0700"} 

Lưu ý: Nếu phiên bản Jackson của bạn là 2.4.x sử dụng

objectMapper.registerModule(new JSR310Module()); 

Hy vọng điều này sẽ hữu ích!

+0

Tôi có một cái gì đó rất lạ: {"thời gian": 1473923145.038000000}. Với giải pháp của bạn, tôi hiện có {"thời gian": "2016-09-15T07: 57: 26.602 + 0000"} như mong muốn. –

+0

Đối với tôi, nó đã đủ với registerModule. Tôi không phải chạm vào thực thể. Cảm ơn!! –

+0

Tôi luôn cảm thấy ớn lạnh khi một số người đăng 5 dòng XML từ một tệp pom, Gralde để giành chiến thắng;) –

2

Trên công trình câu trả lời nhưng nếu bạn không muốn chạm vào lớp thực thể hiện tại của bạn, cài đặt sau sẽ làm việc với ZonedDateTime:

public static ObjectMapper getMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new JavaTimeModule());  
    return mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false) 
.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,false) 
         .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) 
         .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) 
         .setVisibility(mapper.getSerializationConfig() 
           .getDefaultVisibilityChecker() 
           .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
           .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
           .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
           .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 
    } 

Thư viện:

<dependency> 
      <groupId>com.fasterxml.jackson.dataformat</groupId> 
      <artifactId>jackson-dataformat-csv</artifactId> 
      <version>${jackson.dataformat.csv.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-jsr310</artifactId> 
     </dependency> 
Các vấn đề liên quan