Перевести Pojo на JSON - PullRequest
       23

Перевести Pojo на JSON

0 голосов
/ 12 февраля 2019

делаю документацию.В pdf мой объект должен выглядеть как json.Я создаю коллекцию объектов:

Arrays.asList(new CoefficientPerQuantityParameter(2, BigDecimal.valueOf(0.9)),
              new CoefficientPerQuantityParameter(10, BigDecimal.valueOf(0.8)),
              new CoefficientPerQuantityParameter(40, BigDecimal.valueOf(0.7))
)

CoefficientPerQuantityParameter выглядит следующим образом

public class CoefficientPerQuantityParameter {
    private Integer hour;
    private BigDecimal cost;
}

И я принимаю его в файле xhtml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link href="style.css" rel="stylesheet" type="text/css"/>
        <title>My document</title>
    </head>
    <body>
        <div>
             <p th:text="${coefficientPerQuantityParameter}"/>
        </div>
    </body>
</html>

Мне нужноувидеть результат в виде JSON.Но я вижу нечто совершенно иное:

[CoefficientPerQuantityParameter
(hour=2, cost=0.9),
CoefficientPerQuantityParameter
(hour=10, cost=0.8),
CoefficientPerQuantityParameter
(hour=40, cost=0.7)]

Как это получить?

{"2": 0.9,  "10": 0.8,   "40": 0.7} 

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Другой способ сделать это - использовать th:inline="javascript".Вам все равно придется конвертировать ваши данные в Map<String, Double>, чтобы получить желаемый формат вывода.Например:

Контроллер

List<CoefficientPerQuantityParameter> list = Arrays.asList(
        new CoefficientPerQuantityParameter(2, BigDecimal.valueOf(0.9)),
        new CoefficientPerQuantityParameter(10, BigDecimal.valueOf(0.8)),
        new CoefficientPerQuantityParameter(40, BigDecimal.valueOf(0.7))
);

Map<String, BigDecimal> map = list.stream().collect(Collectors.toMap(
        o -> "" + o.getHour(),
        CoefficientPerQuantityParameter::getCost)
);

Шаблон

<span th:inline="javascript">[[${map}]]</span>

Выход

<span>{"2":0.9,"40":0.7,"10":0.8}</span>
0 голосов
/ 12 февраля 2019

Самый классический способ сериализации вышеуказанного списка POJO экземпляров состоит в том, чтобы сериализовать его как массив.

import com.fasterxml.jackson.databind.ObjectMapper;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

public class MapperApp {

    public static void main(String[] args) throws Exception {
        List<CoefficientPerQuantityParameter> coefficients = Arrays.asList(new CoefficientPerQuantityParameter(2, BigDecimal.valueOf(0.9)),
                new CoefficientPerQuantityParameter(10, BigDecimal.valueOf(0.8)),
                new CoefficientPerQuantityParameter(40, BigDecimal.valueOf(0.7)));

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(coefficients));
    }
}

Вышеупомянутый код печатает:

[ {
  "hour" : 2,
  "cost" : 0.9
}, {
  "hour" : 10,
  "cost" : 0.8
}, {
  "hour" : 40,
  "cost" : 0.7
} ]

Если вы хотите иметьструктура, где hour - это ключ, а cost - это значение, которое я предлагаю преобразовать в данный массив в Map вручную и сериализовать результат.

import com.fasterxml.jackson.databind.ObjectMapper;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MapperApp {

    public static void main(String[] args) throws Exception {
        List<CoefficientPerQuantityParameter> coefficients = Arrays.asList(new CoefficientPerQuantityParameter(2, BigDecimal.valueOf(0.9)),
                new CoefficientPerQuantityParameter(10, BigDecimal.valueOf(0.8)),
                new CoefficientPerQuantityParameter(40, BigDecimal.valueOf(0.7)));

        Map<Integer, BigDecimal> map = coefficients.stream()
                .collect(Collectors.toMap(CoefficientPerQuantityParameter::getHour, CoefficientPerQuantityParameter::getCost));

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map));
    }
}

Выше кода печатается:

{
  "2" : 0.9,
  "40" : 0.7,
  "10" : 0.8
}
...