Как десериализовать этот фрагмент Navitia, используя Джексона? - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь использовать API Navitia, и в настоящее время я сталкиваюсь со странной проблемой десериализации встроенного типа места.

Чтобы упростить задачу, у меня есть следующий фрагмент JSON:

    "embedded_type": "stop_area",
    "stop_area": {
      "codes": [{
        "type": "CR-CI-CH",
        "value": "0085-011205-00"
      }, {
        "type": "CR-CI-CH",
        "value": "0085-011205-00"
      }, {
        "type": "UIC8",
        "value": "85011205"
      }, {
        "type": "external_code",
        "value": "OCE85011205"
      }],
      "name": "Lausanne",
      "links": [],
      "coord": {
        "lat": "46.517297",
        "lon": "6.629229"
      },
      "label": "Lausanne (Lausanne)",
      "timezone": "Europe\/Paris",
      "id": "stop_area:OCE:SA:85011205"
    },
    "quality": 0,
    "name": "Lausanne (Lausanne)",
    "id": "stop_area:OCE:SA:85011205"

, который я пытаюсь поместить в этот класс

public class Place extends Named {
    public int quality;
    public String id;
    public String name;
    public PlaceEmbeddedType embedded_type;
}

с PlaceEmbeddedType, определенным следующим образом

@JsonTypeInfo(use = Id.NAME, include = As.EXTERNAL_PROPERTY)
@JsonSubTypes({
        @JsonSubTypes.Type(value = StopArea.class, name = "stop_area"),
        @JsonSubTypes.Type(value = StopPoint.class, name = "stop_point"),
        @JsonSubTypes.Type(value = Address.class, name = "address"),
        @JsonSubTypes.Type(value = POI.class, name = "poi"),
        @JsonSubTypes.Type(value = AdministrativeRegion.class, name = "administrative_region") 
        })
public interface PlaceEmbeddedType {

}

Я бы подумал, что @JsonTypeInfo(use = Id.NAME, include = As.WRAPPER_OBJECT) будетправильное отображение, но когда я его использую, я получаю

[INFO] com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (VALUE_STRING), expected START_OBJECT: need JSON Object to contain As.WRAPPER_OBJECT type information for class com.github.jenkinsx.quickstarts.vertx.rest.prometheus.navitia.PlaceEmbeddedType
[INFO]  at [Source: (okhttp3.ResponseBody$BomAwareReader); line: 1, column: 2527] (through reference chain: com.github.jenkinsx.quickstarts.vertx.rest.prometheus.navitia.LinesList["lines"]->java.util.ArrayList[0]->com.github.jenkinsx.quickstarts.vertx.rest.prometheus.navitia.Line["routes"]->java.util.ArrayList[0]->com.github.jenkinsx.quickstarts.vertx.rest.prometheus.navitia.Route["direction"]->com.github.jenkinsx.quickstarts.vertx.rest.prometheus.navitia.Place["embedded_type"])

Так что я ищу способ использовать мою стратегию WRAPPER_TYPE для объекта с уже существующими полями.Как я могу это сделать?

...