Как сериализовать указанные c атрибуты объекта Java в JSON с Джерси? - PullRequest
1 голос
/ 25 апреля 2020

Я использую платформу Jersey для создания Rest API. API создает учетную запись для гонщика и водителя для совместного использования приложения. Здесь приведены зависимости для моего проекта.

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-binding</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>    
    </dependencies>

У меня возникла проблема с сериализацией Java объекта «Пользователь» (который содержит всю информацию о поездках, опубликованных водителем) в JSON объект, потому что я хочу, чтобы указанные c атрибуты были преобразованы обратно в JSON. Вот мои атрибуты класса «Пользователь»:

    private String first_name;
    private String last_name;
    private String phone;
    private String picture;
    private boolean is_active;
    private int aid;
    private List<Rating> drivers_rating;
    private List<Rating> riders_rating;

Но, когда я делаю GET-запрос для получения рейтинга драйверов, я хочу, чтобы только ответ JSON содержал «first_name, phone и drivers_rating». Вот что я попробовал:

    @Path("{aid}/driver")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public User viewDriverRatings(@PathParam("aid") int aid) {
        return repo.viewDriverRatings(aid);
    }

Но это возвращает ответ JSON со всеми атрибутами. Что я должен сделать, чтобы возвращать только указанные c атрибуты в JSON?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Если вам нужно ограничить столбцы. Различные варианты для вас. 1. Создайте другой класс для этой ограниченной видимости, содержащий «first_name, phone и drivers_rating». Это было бы лучше с точки зрения дизайна. 2. Может использовать переходный процесс. Это не было бы хорошим дизайном, так как это запретило бы сериализовать весь объект класса с этими свойствами для любой другой функции.

Я бы не рекомендовал ограничивать уровень JSON. Это был бы плохой дизайн.

1 голос
/ 27 апреля 2020

Я согласен с ответом Nilotpal. Я видел случаи, когда ответ может содержать больше информации, чем запрос на конкретный c ресурс. Я видел код, где есть отдельные классы для запросов и ответов. В вашем случае вы можете создать класс UserReponse, который будет иметь все поля, которые вы хотите вернуть для транзакции GET. Аналогично для рабочего процесса POST у вас может быть класс UserRequest, в котором будут поля, которые потребитель может отправлять в теле запроса,

...