Sử dụng Jackson-databind mapping Object <-> Json và ứng dụng load file config
Java
78
Jackson
1
White

Tất Huân viết ngày 15/07/2018

Sử dụng Jackson-databind mapping Object <-> Json và ứng dụng load file config

1. Mapping Object <-> Json

Jackson-databind Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>

Ở đây mình sẽ lấy 1 ví dụ đơn giản về cách sử dụng jackson-databind để mapping qua lại giữa Object People và Json

People.class

class People {

    private String name
    private String fullName
    private int age

    People() {
        super()
    }

    People(String name, int age, String fullName) {
        this.name = name
        this.age = age
        this.fullName = fullName
    }

    String getName() {
        return name
    }

    int getAge() {
        return age
    }

    String getFullName() {
        return fullName
    }

    @Override
    String toString() {
        return "Name: $name \nFull Name: $fullName\nAge: $age"
    }
}

Khởi tạo objectMapper:

 ObjectMapper objectMapper = new ObjectMapper().with {
    configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    configure(JsonParser.Feature.ALLOW_COMMENTS,true)
    setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
 }

Ở đây mình có 3 config:

configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

Giá trị mặc định là true, 1 exception sẽ throw ra khi objectMapper không tìm thấy 1 trường trong object tương ứng với trường tìm thấy trong Json. (Tức yêu cầu mọi trường có trong Json phải tồn tại trong Object). Và giá trị false thì ngược lại, bạn có thể thêm thừa field trong Json cũng không vấn đề.

configure(JsonParser.Feature.ALLOW_COMMENTS,true)

Khi set giá trị bằng true, bạn có thể comment trong chuỗi Json, nó chấp nhận cú pháp comment trong Java hoặc C++.

setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) 

Quy ước naming strategy, ở đây mình chọn SNAKE_CASE tức là 1 trường trong object có tên fullName khi chuyển qua Json sẽ trở thành full_name, và ngược lại, giá trị của trường full_name trong Json sẽ được bind vào trường fullName trong object.

Chuyển từ Object -> Json:

People people = new People("Huan", 22, "Tat Huan")
String json = objectMapper.writeValueAsString(people)
println json

Output:

{
  "name": "Huan",
  "full_name": "Tat Huan",
  "age": 22
}

Chuyển từ Json -> Object:

Input json file:

{
  "name": "Huan",
  "full_name": "Tat Huan",
  "age": 22
}
File jsonFile = new File("src/main/resources/people.json")
People people = objectMapper.readValue(jsonFile, People.class)
println people.toString()

Output:

Name: Huan 
Full Name: Tat Huan
Age: 22

Load config từ file:

config.json

{
  "mongodb.uri":"mongodb://localhost:57017"
}

Appconfig:

class AppConfig {

    @JsonProperty("mongodb.uri")
    MongoDB mongoDB

    static AppConfig newInstance(File appConfigFile) {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()).with {
            setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
            configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        }

        AppConfig appConfig = objectMapper.readValue(appConfigFile, AppConfig.class)
        return appConfig

    }

    MongoDB getMongoDB() {
        return mongoDB
    }
}

Sử dụng Appconfig:

AppConfig appConfig = AppConfig.newInstance(new File("src/main/resources/config.json"))
println appConfig.getMongoDB().getUri()

Output:

Created new instance with uri: mongodb://localhost:57017
mongodb://localhost:57017

Code example: https://github.com/huantt/jackson-example

Write for sharing, write for remembering - Jack180715

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Tất Huân

4 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
4 2
Một số hàm giúp mapping data đơn giản với Groovy Ví dụ với list data như sau: def student1 = name: "Huan", age: 22, gender: "male"] def student...
Tất Huân viết 1 tháng trước
4 2
White
3 2
Giảm "quay tay" trên Intellij Hôm nay mình xin chia sẻ với anh em cách định nghĩa các template tương tự như thằng psvm mà chúng ta vẫn dùng hằng n...
Tất Huân viết hơn 1 năm trước
3 2
White
3 0
Vấn đề có thể gặp khi thao tác với String trong Java và Groovy Vấn đề 1: Toán tử "==" trong Groovy khác với Java Cùng 1 ví dụ như sau: String y...
Tất Huân viết 1 tháng trước
3 0
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết gần 3 năm trước
0 0
Male avatar
9 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết gần 2 năm trước
9 5
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!