Частичная JSON-сериализация во время выполнения (для запросов RESTful) - PullRequest
13 голосов
/ 23 августа 2010

Я пытаюсь преобразовать объект Java в JSON в Tomcat (в настоящее время используется Джексон).Основываясь на полях в запросе RESTful, я хочу сериализовать только эти поля.Я хочу поддерживать запросы для любого подмножества полей, поэтому я хотел бы сделать это во время выполнения (динамически).

Например, предположим, что я хочу поддержать частичную сериализацию для объектов User:

class User {
    private final String id;
    private final String firstName;
    private final String lastName;

    public User(String id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getId() { return id; }
    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
}

Если я сделаю запрос на:

GET /users/{id}/?fields=firstName,lastName

Я хочу получить что-то вроде {"firstName":"Jack","lastName":"Johnson"}.

Если я сделаю запрос на:

GET /users/{id}/?fields=firstName

Я хочу получить что-то вроде {"firstName":"Jack"}.

Джексона JSON View дает возможность определять подмножества логических свойств (вещей, доступных через геттеры или поля) для сериализации.Однако они определяются статически (с использованием аннотаций) и выбираются только динамически (для сериализации).На практике я хочу поддержать запрос любого подмножества полей объекта, чтобы потенциально иметь тысячи представлений JSON (10 полей подразумевают 1023 подмножества!).

Какая библиотека JSON поддерживает частичную сериализацию во время выполнения?

Ответы [ 3 ]

1 голос
/ 20 сентября 2010

Мы используем Google GSON для преобразования туда и обратно между объектом Java и JSON.Я не уверен, обладает ли она той функциональностью, которую вы ищете, но она очень проста в использовании, и документы тоже хороши.

Если вы не можете найти библиотеку, которая делает то, что вам нужно, я предлагаюпредложение использовать более свободные структурированные классы (например, HashMap) или пользовательские классы представления для связи между вашим кодом и JSON.Это добавит еще один или два слоя, но сложность будет ниже.Удачи.

0 голосов
/ 19 октября 2015

Начиная с весны 4.2.0. Пожалуйста, у вас есть полный контроль над возвращаемыми полями, или вы можете сделать это, используя JsonFilters, как описано в следующих ссылках: 1. https://jira.spring.io/browse/SPR-12586 2. http://wiki.fasterxml.com/JacksonFeatureJsonFilter

@RequestMapping(method = RequestMethod.POST, value = "/springjsonfilter")
    public @ResponseBody MappingJacksonValue byJsonFilter(...) {
        MappingJacksonValue jacksonValue = new MappingJacksonValue(responseObj);    
        jacksonValue.setFilters(customFilterObj);
        return jacksonValue;
    }
0 голосов
/ 24 августа 2010

Я думаю, что json-lib и flex-json поддерживают более динамичную / гибкую фильтрацию.

С Джексоном некоторые пользователи используют HashMaps или JsonNodes в качестве более свободных структур и выполняют фильтрацию оттуда.1004 * Кроме того, хотя это не поможет вам в краткосрочной перспективе, в Jackson 1.6 есть улучшения как для JsonNode (retainAll (String ... names), так и для удаления (String ... names) и, возможно, ObjectMapper, поскольку это известная областьдля улучшений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...