powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как конвертировать Java bean в JSON, выбрав только некоторые поля
8 сообщений из 8, страница 1 из 1
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38879761
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
У меня есть бин
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class User {
    private int id;
    private String name;
    private Address address;
    private List<String> favoriteBooks;
    private List<String> favoriteFilms;

    //getters and setter
}


Я хочу получить JSON, в котором только 3 поля id, name, favoriteBooks. И желательно не сеттить их руками. Т.е. хочется что-то вроде решения в 2 строки:
Код: java
1.
2.
String[] fieldNames = { "id", "name", "favoriteBooks" };
JsonObject jo = new JsonObject(user, fieldNames);


Попробывал библиотеку json.org, но она для javabean-ов не умеет выбирать определенные поля. Их можно выбирать только если эти поля буду public.
Посоветуйте какую-нибудь библиотеку, которая умеет так обращаться с бинами.
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38879762
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01,

Jackson, Gson
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38879800
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, получилось это сделать с помощью библиотеки Jackson
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
List<User> users= userDAO.getSomeUsers();
String result = "";
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(Object.class, UserJSONFilter.class);
String[] ignorableFieldNames = {"favoriteBooks", "favoriteFilms"};

FilterProvider filters = new SimpleFilterProvider().addFilter(
      "UserJSONFilter",
      SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames));

try {
      result = mapper.writer(filters).writeValueAsString(users);
} catch (IOException e) {
      logger.error("Error convert into JSON format.", e);
}


Код: java
1.
2.
@JsonFilter("UserJSONFilter")
public class UserJSONFilter {}


Код: java
1.
2.
3.
4.
5.
6.
7.
public class Address {
    private Long id;
    private String city;
    private String street;

    //getters and setters
}


Но кое-что не могу сделать: у меня поле id повторяется в классе User и Address. Так вот как в массиве строк ignorableFieldNames правильно указать, что я хочу выводить id класса User, но игнорировать id класса Address.
Попробовал вот так, но не получается:
Код: xml
1.
2.
3.
Вариант 1: {"favoriteBooks", "favoriteFilms", "Address.id"}
Вариант 2: {"favoriteBooks", "favoriteFilms", "address.id"}
Вариант 3: {"favoriteBooks", "favoriteFilms", "com.app.entities.Address.id"}


Если указать просто
Код: xml
1.
{"favoriteBooks", "favoriteFilms", "id"}

то будет игнорировать id во всех классах. Как мне это разрулить?
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38879887
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это, мягко выражаясь.

Тривиальным образом делается с помощью XStream. Сейчас проверил. Для преобразования в JSON можно найти много чего, необязательно хвататься за первое, что кто-то скажет. Я спрашиваю у google. Библиотека XStream используется для работы с XML (часто ею пользуюсь), но там ещё есть преобразование в JSON. Мне недавно понадобилось преобразовать: XML->Java объект->JSON, что им и сделал. Много изучать не пришлось. В данном случае имеем половину задачи: Java объект->JSON.
Вот приблизительно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Test {

	public static void main(String[] args) {
		Address address = new Address(100L, "йа город", "йа улицо");
		User user = new User (100, "йа имя", address);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
			public HierarchicalStreamWriter createWriter(Writer writer) {
				return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
			}
		});
		xstream.processAnnotations(new Class [] {User.class});

		System.out.println(xstream.toXML(user));
	}

}



Где класс User:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import com.thoughtworks.xstream.annotations.XStreamOmitField;


public class User {
    private int id;
    private String name;
    private Address address;
    @XStreamOmitField
    private List<String> favoriteBooks;
    private List<String> favoriteFilms;

    public User (int id, String name, Address address) {
    	this.id = id;
    	this.name = name;
    	this.address = address;
    	this.favoriteBooks = new ArrayList<String> ();
    }
}


В нём для примера я создал пустой список favoriteBooks, а favoriteFilms не инициализировал. В результате favoriteFilms вообще не вывелся в JSON, а favoriteBooks вывелся, но пустой. Чтобы отменить его вывод, я добавил аннотацию @XStreamOmitField в поле класса User, а для её обработки добавил в класс Test оператор xstream.processAnnotations(new Class [] {User.class});
После чего favoriteBooks из вывода пропал и получилось:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
{
  "id": 100,
  "name": "йа имя",
  "address": {
    "id": 100,
    "city": "йа город",
    "street": "йа улицо"
  }
}



Ещё там может быть полезна аннотация @XStreamAlias для преобразования имён полей и классов.
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38879889
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл.
Надо убрать вывод id из адреса.
Для этого в класс Address добавляем аннотацию:
Код: java
1.
2.
 @XStreamOmitField
    private Long id;



А в классе Test изменяем оператор:
Код: java
1.
xstream.processAnnotations(new Class [] {User.class, Address.class});



Результат:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
{
  "id": 100,
  "name": "йа имя",
  "address": {
    "city": "йа город",
    "street": "йа улицо"
  }
}
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38880029
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan M,

Спасибо за пример, но он по сути сводится к аналогичной аннотации из других библиотек (json.org, jackson), а именно @JsonIgnore.
К тому же, это не тот гибкий способ, который я искал. Представь, что объект класса A возвращается двумя методами:
в одном методе надо игнорировать поле id, а в другом нет. Это уже аннотацией @XStreamOmitField не разрулишь, потому что из-за неё в обоих методах будет игнорироваться поле id. Поэтому я применяю разные фильтры к одному и тому же объекту А. И нужные мне ответы я нашел тут .
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38880051
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то в XStream есть способ и без аннотаций.
Вместо них в моём программном примере достаточно записать

Код: java
1.
xstream.omitField(Address.class, "id");


То есть, проще, чем делает Джексон. Аннотация @XStreamAlias тоже необязательна, вместо неё можно xstream.alias (...). Таким образом, можно вообще обойтись без модификации классов User и Address.
Ещё способ - не зависящий от библиотеки: наследованием приводить класс с лишними полями к разным классам без них.
Это я описал для полноты ответа.
...
Рейтинг: 0 / 0
Как конвертировать Java bean в JSON, выбрав только некоторые поля
    #38880060
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут да, согласен, без аннотаций пример хороший. А касаемо деления наследованием тоже можно поспорить. Он хорош тогда, когда у тебя 2-3 варианта комбинаций полей, и из базы удобнее доставать. Но если у тебя комбинаций 5, то гораздо лучше пользоваться разными json-библиотеками и отфильтровывать ненужное. Хотя в последнем варианте встает вопрос, правильно ли все в проекте спроектировано =)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как конвертировать Java bean в JSON, выбрав только некоторые поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]