- vừa được xem lúc

Parse Json thành object dựa vào type

0 0 30

Người đăng: Nguyễn Đức Thành

Theo Viblo Asia

Bài viết này mình sẽ hướng dẫn cách để parse từ json thành object dựa vào type. Vì đôi khi json của chúng ta sẽ có nhiều dạng, và bạn muốn parse ra object dựa vào dạng, ví dụ json dạng A thì parse ra object A còn json dạng B thì parse ra object B.

1. Miêu tả project

Tưởng tượng chúng ta là một là quản lí dân cư ở 1 khu vực. Ở khu vực chúng ta có 2 dạng dân cư, một là học sinh, 2 là người trưởng thành (người đã đi làm), mỗi dạng dân cư có những property riêng và chúng ta muốn lưu những properties này dưới dạng json trong database. Khi lấy data dạng json này lên, ta muốn application của chúng ta dựa vào type (học sinh hoặc người đi làm) để parse json này ra những object cần thiết và xử lí tiếp.

2. Tạo project

Chúng ta vào trang https://start.spring.io/ và tạo project spring boot image.png

Chúng ta sẽ sử dụng in-memory database h2 cho project.

3. Config project

3.1 Project structure

image.png

3.2 Những files cần tạo

  • Config application.properties:

     spring.datasource.url=jdbc:h2:mem:demojsonmapping spring.datasource.driverClassName=org.h2.Driver spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.defer-datasource-initialization=true 
  • Tạo file schema.sql và data.sql

    • schema.sql:
      DROP TABLE IF EXISTS resident; CREATE TABLE resident ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(250) NOT NULL, address VARCHAR(250) NOT NULL, metadata VARCHAR(10000) NOT NULL
      );
      

    metadata là column để lưu những properties của resident

    • data.sql:
      INSERT INTO resident (name, address, metadata) VALUES
      ('Thanh', 'Ho Chi Minh', '{"type": "student", "mode" : "active", "classNumber": 10}'),
      ('Bao', 'Gia Lai', '{"type": "mature", "mode" : "active", "maritalStatus": "single"}'); 
  • Resident entity:

    @Getter
    @Setter
    @Entity
    public class Resident { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; private String address; private String metadata;
    }
    
  • Metadata interface: đây là 1 interface chung cho metadata của những resident (học sinh và người trưởng thành)

     @JsonSubTypes({@JsonSubTypes.Type(StudentMetadata.class), @JsonSubTypes.Type(MatureMetadata.class)}) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) public interface Metadata { String getMode(); }
    

@JsonSubTypes: ở đây mình sẽ define ra những class có thể được parse ra của json metadata, cụ thể ở đây có StudentMetadata class và MatureMetadata class.

@JsonTypeInfo: chứa những thông tin cho việc serialization và deserialization JSON, chúng ta sẽ dựa vào property "type" để xác định nó thuộc vào object nào. Cả 2 class metadata đểu có chung thuộc tính mode nên chúng ta sẽ để 1 abstract method getMode trong interface Metadata.

  • StudentMetadata:
     @JsonTypeName("student") @Getter @Setter @ToString public class StudentMetadata implements Metadata { private String mode; private int classNumber; }
    

@JsonTypeName: logical name của type này, dùng để xác định khi parse từ json sang object

  • MatureMetadata:

     @JsonTypeName("mature") @Getter @Setter @ToString public class MatureMetadata implements Metadata { private String mode; private String maritalStatus; } 
  • StudentRepository:

     @Repository public interface ResidentRepository extends JpaRepository<Resident, Integer> { } 
  • StudentController:

     @RestController @RequestMapping("/residents") @RequiredArgsConstructor @Slf4j public class ResidentController { private final ResidentRepository residentRepository; @GetMapping("/metadata/{id}") public void printMetadataOfStudent(@PathVariable int id) throws JsonProcessingException { Resident resident = residentRepository.getById(id); Metadata metadata = new ObjectMapper() .readerFor(Metadata.class) .readValue(resident.getMetadata()); if (metadata.getClass().equals(StudentMetadata.class)){ StudentMetadata studentMetadata = (StudentMetadata)metadata; log.info("This is a student"); log.info("Student metadata: {}", studentMetadata); } else if (metadata.getClass().equals(MatureMetadata.class)){ MatureMetadata matureMetadata = (MatureMetadata)metadata; log.info("This is a mature person"); log.info("Mature metadata: {}", matureMetadata); } else { log.info("No matching resident"); } } }
    

Chúng ta sẽ parse từ json string ra Metadata object. Sau đó chúng ta sẽ compare class đó với StudentMetadata hoặc MatureMetadata rồi parse ra thành những object và chúng ta sẽ lấy được những property cần thiết. Ở đây mình sẽ log ra những thông tin của metadata này.

4. Test

  • Run project
  • Gọi postman với id = 1 và check log
    • image.png
    • image.png
  • Gọi postman với id = 2 và check log
    • image.png
    • image.png

5. References

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 282

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 258

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 37

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 180

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 55

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 124