Джексон - динамическое подавление сериализации (записи) свойств

Я пытаюсь преобразовать объект Java в объект JSON в Tomcat/Джерси, используя Jackson. И хотите динамически подавлять сериализацию (запись) определенных свойств.

Я могу использовать JsonIgnore, но хочу принять решение об игнорировании во время выполнения. Любые идеи??

Итак, в приведенном ниже примере я хочу подавить поле «id», когда я сериализую объект пользователя в JSON.

new ObjectMapper.writeValueAsString(user);


class User {

private String id = null;
private String firstName = null;
private String lastName = null;

//getters
//setters

}//end class

person kapso    schedule 05.06.2010    source источник


Ответы (4)


Да, JSON View — это то, что вам нужно.

Если вы, например. нужно позволить клиенту решить, какие поля маршалировать, этот пример может помочь: http://svn.codehaus.org/jackson/tags/1.6/1.6.3/src/sample/CustomSerializationView.java

person dean    schedule 12.12.2010
comment
Эта ссылка требует аутентификации - person RevanProdigalKnight; 23.10.2015
comment
Эта ссылка больше не работает, но я предполагаю, что следующая ссылка будет эквивалентной. github.com/FasterXML/jackson-1/blob/master/src/sample/sample/ - person dpkg; 14.05.2020

Проверять

ObjectMapper.configure(SerialiationJson.Feature f, boolean value)

и

org.codehaus.jackson.annotate.JsonIgnore 

аннотация

Это будет работать только тогда, когда вы хотите, чтобы все экземпляры определенного типа игнорировали идентификатор при сериализации. Если вы действительно хотите динамическую настройку (то есть настройку для каждого экземпляра), вам, вероятно, придется взломать библиотеку Джексона самостоятельно.

person Mihai Toader    schedule 05.06.2010

Я не вижу никакого способа сделать это. Если вам нужно динамически решить, какие свойства маршалируются, то я предлагаю вам вручную создать Map ключей к значениям для ваших объектов, а затем передать этот Map Джексону, а не передавать объект User напрямую.

person skaffman    schedule 05.06.2010
comment
Благодарю. Я думаю, что шаблон Map тоже немного слаб, когда дело доходит до создания массивов JSON. Map‹String,Object› map1 = new HashMap‹String,Object›(); map1.put(fname, Стив); map1.put(имя, Колли); Map‹String,Object› map2 = new HashMap‹String,Object›(); map2.put(fname, Джош); map2.put(имя, Roff); Список jsonArray = новый ArrayList(); jsonArray.добавить (карта1); jsonArray.добавить (карта2); новый ObjectMapper().writeValueAsString(jsonArray)... не производит??? [{'fname':'Стив','lname':'Колли'},{'fname':'Джош','lname':'Рофф'}] - person kapso; 05.06.2010
comment
@ kapil.isr: Да, я только что попробовал, все работает. Порядок ключей другой, но это потому, что вы использовали HashMap, а не LinkedHashMap. - person skaffman; 05.06.2010
comment
Также знаете ли вы, можно ли использовать ObjectMapper среди потоков, я знаю, что документ говорит, что может. Но я просто хотел убедиться, если это так. Кажется, что информации о Джексоне не так много, их собственный документ кажется ограниченным. - person kapso; 05.06.2010
comment
ObjectMapper можно поделиться, да. - person skaffman; 05.06.2010
comment
Я не совсем уверен, почему вы сомневаетесь в явных гарантиях авторов библиотеки (полагаю, вы ссылаетесь на wiki .fasterxml.com/JacksonFAQ, является ли ObjectMapper потокобезопасным? ), но да, он полностью доступен для совместного использования, если вы не пытаетесь изменить параметры конфигурации при совместном использовании. - person StaxMan; 15.06.2010

Пробовали ли вы использовать представления JSON? Представления позволяют использовать механизм на основе аннотаций для определения различных профилей, поэтому, если вам просто нужны немного отличающиеся представления для разных пользователей, это может сработать для вас.

person StaxMan    schedule 14.06.2010