Преобразовать List в Json

Я хочу записать результат выполнения sql запроса в List.

Вот мой код:

@PersistenceContext
    private EntityManager em;

    @RequestMapping( "/statistics")
    public  @ResponseBody
    List<Object> statisticsMethod(
    ) {
        //EntityManager em = emf.createEntityManager();
        List<Object> results = em.createNativeQuery("select 'restaurant',   rest.name from \n" +
                "tables tab\n" +
                "left join orders ord\n" +
                "on ord.table_id=tab.id\n" +
                "left join restaurants rest\n" +
                "on rest.id=tab.restaurant_id\n" +
                "\twhere ord.begin_time>=DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1  month')\n" +
                "\t\t\t\t  and ord.begin_time<=DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1  month - 1 day')\n" +
                "\t\t\t\t  group by rest.name\n" +
                "\t\t\t\t  order by count(tab.restaurant_id) desc\n" +
                "\t\t\t\t  limit 4;").getResultList();



        return  results;
    }

Результат этого метода следующий JSON:

[
[
"restaurant",
"Torro Grill Воронеж"
],
[
"restaurant",
"Балаган Сити"
],
[
"restaurant",
"Платонов"
],
[
"restaurant",
"Старый город"
]
]

Но я хочу чтобы JSON выглядел так:

[

{"restaurant":"Torro Grill Воронеж"},
{"restaurant":"Балаган Сити"},
{"restaurant":"Платонов"},
{"restaurant":"Старый город"},
]

Подскажите, пожалуйста, как этого добиться.


Ответы (2 шт):

Автор решения: alex

Можно сделать через кастомный сериализатор.

Создадим модель получаемых данных:

@JsonSerialize(using = MySerializer.class)
public class Model{
    List<Object> list;
    public Model(List<Object> list){
          this.list = list;
    }
}

Реализуем сериализатор:

 public class MySerializer extends JsonSerializer<Model>{

        public MySerializer() {
        }

        @Override
        public void serialize(Model model, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            List<Object> value = model.list;
            gen.writeStartArray();
            value.forEach(it ->{
                try {
                    gen.writeStartObject();
                    String[] arr = (String[]) it;
                    gen.writeFieldName(arr[0]);
                    gen.writeString(arr[1]);
                    gen.writeEndObject();
                }catch (IOException e){
                    e.printStackTrace();
                }
            });
            gen.writeEndArray();
        }
    }

Поменяем тип возвращаемого значения:

Model statisticsMethod(){
    List<Object> results = em.createNativeQuery(------
return new Model(results);
}
→ Ссылка
Автор решения: Aziz Umarov

Вообще-то так не делается, Вы пытаетесь сохранить объект в json, при этом объект это запись в таблице. По результату у Вас 2 поля со значениями, а вы хотите 1. смотрите случай когда SELECT rest.name AS restaurant FROM ....

→ Ссылка