Преобразование списка объектов Java для правильного формата пары значений имени в Json с использованием Gson - PullRequest
0 голосов
/ 19 июня 2020

У меня есть класс Java с именем User с

@Column(name = "id")
private Long id;
@NotNull
@Column(name = "NAME")
private String name;

Я пытаюсь получить некоторые детали в списке и преобразовать их в JSOn вот так:

Session session = this.sessionFactory.getCurrentSession();
String queryString="select id,name from User where unit=:name";
Query query= sessionFactory.getCurrentSession().createQuery(queryString);
query.setParameter("name", name);
List<User> users= (List<User>) query.list();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Map<String, List<User>> wrap = new HashMap<>();
wrap.put("users", users);  // wrap user list in a map
String json = gson.toJson(wrap);

Это дает JSON

{
 "users": [
 [
  1,
  "Room"
],
[
  2,
  "Regi"
 ],
 ]
}

Как мне изменить его так, чтобы я получил JSON как

{
 "users": [
 [
   "id":1,
   "name":"Rovom"
 ],
 [
   "id":2,
   "name":"Regi"
 ],
]
}

Редактировать Я понял, что это запрос, который вызывает вопрос. Если я использую

String queryString="from User where unit=:name";

, он дает правильный формат. Как это исправить?

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Хм, похоже на стирание типа во время выполнения.

Ваш List<User> с первым запросом на самом деле List<Object[]>, в котором он был сериализован. Если бы вы попытались получить доступ к объекту User из списка, я полагаю, вы получите ошибку времени выполнения.

См. Документацию по спящему режиму:

Возвращает результаты запроса в виде Список. Если запрос содержит несколько результатов перед строкой, результаты возвращаются в экземпляре Object [].

EDIT

, чтобы получить список пользователей с заполненными только двумя полями, создать подходящую конструкцию и использовать запрос типа

select new package.path.to.class.User(id,name) from User where unit=:name"
1 голос
/ 19 июня 2020

В случае с Джексоном это будет выглядеть так:

   String json = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueToString(wrap);

По крайней мере, для этого вам нужны данные jackson-core и jackson-databind.

Полный пример с использованием Jackson:

public static class User {
    private Long id;
    private String name;

    public User(long i, String n) {
        id = i;
        name = n;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public static void main(String... args) {
    try {
        Map<String,Object> map = new HashMap<>();
        map.put("users",  Arrays.asList(new User(1, "Stack"), new User(2, "Overflow")));
        System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter()
                .writeValueAsString(map));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

произвел этот вывод:

{
  "users" : [ {
    "id" : 1,
    "name" : "Stack"
  }, {
    "id" : 2,
    "name" : "Overflow"
  } ]
}
0 голосов
/ 22 июня 2020

Как упомянул пользователь @Turo, это происходит из-за стирания типа во время выполнения.

Чтобы исправить это, запрос должен быть изменен на

String queryString="select id,name from User where unit=:name";
Query query= sessionFactory.getCurrentSession().createSQLQuery(queryString).addScalar("name", new StringType()).addScalar("id", new IntType()).setResultTransformer(Transformers.aliasToBean(User.class));

query.setParameter("name", name);

, addScalar () будет отображать значения для объектов User , и это дает требуемый результат.

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