Lọc field thừa trong Json string với Java Squiggly

Hi Vtitans,
Một vấn đề với POJO: sau khi ta viết một POJO với một tá field, và cảm thấy mình đã sẵn sàng bind data vào nó, convert sang Json string để trả về cho một GET request, rồi phát hiện ra là Rest service của chúng ta mong muốn chỉ 5 field trong số đó. Bạn sẽ nghĩ đến 3, 4 phương án, chắc rồi, nhưng trong trường hợp mà mình được hỏi, do đề bài không rõ nên mình hơi lúng túng và mong muốn câu trả lời đơn giản nhất á.

Nghe hơi hướng của GraphQL phải không nhỉ? Không đến mức đó đâu, có lẽ mình chỉ cần Squiggly thôi.

Use cases của Squiggly đã được trình bày đầy đủ trên github, bài này mình trình bày vài dòng code ngắn gọn để hình dung nó làm việc gì thôi nhé. Thực tình mình chỉ cần thấy nó giải quyết nested là thoả mãn rồi.

Maven dependency, lưu ý bạn ấy require Jackson 2:

<dependency>
    <groupId>com.github.bohnman</groupId>
    <artifactId>squiggly-filter-jackson</artifactId>
    <version>1.3.18</version>
</dependency>

Đây là object đầy đủ mà mình dùng để test:

{
    "s1":"A",
    "s2":"B",
    "child":
        {
            "sss1":"C",
            "sss2":"D"
        }
}

Có 4 cái String s1, s2, sss1, sss2.
Dòng code được comment dưới chỉ lấy ra field s1, và child[sss1], và dòng sau đấy thì lấy ra tất cả các field trừ child. Mình phi nguyên class lên cho bạn đỡ mất công viết nha:

package test;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.bohnman.squiggly.*;
import com.github.bohnman.squiggly.util.SquigglyUtils;

public class Executor {
    public static void main(String[] args) throws Exception {
        Parent parent = new Executor.Parent("A", "B", new Executor.Child("C", "D"));
        System.out.println(new ObjectMapper().writeValueAsString(parent));
        //ObjectMapper m = Squiggly.init(new ObjectMapper(), "s1,child[sss1]"); //nested
        ObjectMapper m = Squiggly.init(new ObjectMapper(), "**,-child"); //excluded
        System.out.println(SquigglyUtils.stringify(m, parent));
    }
    public static class Parent {
        public String s1;
        public String s2;
        public Child child;
        public Parent(String s1, String s2, Child child) {
            super();
            this.s1 = s1;
            this.s2 = s2;
            this.child = child;
        }
    }
    public static class Child {
        public String sss1;
        public String sss2;
        public Child(String sss1, String sss2) {
            super();
            this.sss1 = sss1;
            this.sss2 = sss2;
        }
    }
}

Đầy đủ use cases tại: https://github.com/bohnman/squiggly
Có làm bạn thất vọng không? Bài này vớt vát chút nào chăng: https://www.baeldung.com/jackson-serialize-field-custom-criteria

Thân, from Châu D9

1 個のコメント

  • Leave a Reply