Spring RequestBody map JSON строка в координаты Point2D - PullRequest
1 голос
/ 20 января 2020

Я хочу сопоставить входящую строку JSON с пользовательским POJO в моем @PostMapping:

@PostMapping(value = "/classification", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> getClassificationResults (
            @RequestBody Classification classification) {

     this.elasticSearchService.getSpatialData(classification);
  return ResponseEntity.ok(" ");
}

My classification POJO:

public class Classification {
    @JsonProperty
    private ArrayList<Point2D.Double> shapes;
    @JsonProperty
    private String [] colors;
    @JsonProperty
    private String [] pattern;
    @JsonProperty
    private Integer size;
...
}

, который (конечно, ) приводит к ошибке:

JSON ошибка разбора: невозможно создать экземпляр java.awt.geom.Point2D$Double (хотя существует хотя бы один создатель): нет конструктора аргумента строки / метода фабрики для десериализации из значения String

Пример данных:

"[[8.880321034663876,49.121984026160106], 
 [8.746452886806255,49.11327654230291], 
 [8.61786489671323,49.087497674922325],...]"

Мой результирующий объект должен быть не ArrayList из Point2D объектов, а скорее любым типом Array, который содержит те же значения в качестве примера - просто преобразуем в число.

Нужно ли указывать свой десериализатор Джексона (как я могу это сделать?) для этой проблемы, или достаточно изменить конструктор Classification?

1 Ответ

1 голос
/ 20 января 2020

Вы можете реализовать собственный десериализатор или использовать функцию MixIn определить Shape.ARRAY для Point2D класс:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.json.JsonMapper;

import java.awt.geom.Point2D;
import java.util.List;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        JsonMapper jsonMapper = JsonMapper.builder()
                .addMixIn(Point2D.Double.class, Point2DDoubleMixIn.class)
                .build();

        String json = "[[8.880321034663876,49.121984026160106],[8.746452886806255,49.11327654230291],[8.61786489671323,49.087497674922325]]";

        TypeReference<List<Point2D.Double>> type = new TypeReference<List<Point2D.Double>>() {};
        List<Point2D.Double> shapes = jsonMapper.readValue(json, type);
        System.out.println(shapes);
    }
}

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
interface Point2DDoubleMixIn { }

См. Также:

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