Неожиданный конец ввода: ожидаемый маркер закрытия для ОБЪЕКТА

Я пытаюсь создать геоточку в своем приложении движка приложения, но когда я пытаюсь его десериализовать, я получаю это раздражающее сообщение:

Uncaught exception from servlet
org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (from [Source: java.io.StringReader@1a21658; line: 1, column: 0]).

Это мой код JSON:

{
    "id": 31,
    "name": "pepe",
    "mail": "[email protected]",
    "password": 123,
    "age":10,
    "birthday": "01-06-1991",
    "desc" : " bla bla",
    "gp": {
     "latitude": 64.124596,
     "longitude": -147.8632
     }
}

и это объявление геоточки и моего собственного метода десериализации:

GeoPoint gp;

public GeoPoint getGp() {
    return gp;
}

@JsonDeserialize(using = CustomGeoPintDeserializer.class)
public void setGp(GeoPoint gp) {
    this.gp = gp;
}

public  class CustomGeoPintDeserializer extends JsonDeserializer<GeoPoint> {

    @Override
    public GeoPoint deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        System.out.println("ENTRA");
        ObjectMapper mapper = new ObjectMapper();
        JsonNode actualObj = mapper.readValue(jsonParser.getText(), JsonNode.class);

        double latitude = actualObj.get("latitude").getDoubleValue();

        double longitude = actualObj.get("longitude").getDoubleValue();


        return new GeoPoint(latitude,longitude);
    }
}

person Lucía Román González    schedule 27.08.2014    source источник
comment
Как выглядит класс GeoPoint? Что такое пакет этого класса?   -  person Michał Ziober    schedule 27.08.2014


Ответы (2)


Похоже, ваш класс GeoPoint имеет такой конструктор: public GeoPoint(double latitude, double longitude). В этом случае мы можем использовать функция MixIn. Мы должны создать дополнительный абстрактный класс, в котором мы обеспечим сопоставление между вашими POJO и JSON.

abstract class GeoPointMixIn {

    GeoPointMixIn(@JsonProperty("latitude") double latitude, @JsonProperty("longitude") double longitude) {

    }
}

И простое использование:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(GeoPoint.class, GeoPointMixIn.class);

System.out.println(mapper.readValue(JSON, YourRootPojo.class));

Как видите, вам не нужно реализовывать собственный десериализатор для класса GeoPoint.

person Michał Ziober    schedule 27.08.2014
comment
какую версию jackson мне нужно использовать mapper.addMixInAnnotations? - person Lucía Román González; 28.08.2014
comment
Я использовал версию 2.4.1 (fasterxml), но думаю, что этот метод существует с версии 2.0.0. - person Michał Ziober; 28.08.2014

Для меня это было очень простое решение.

Я забыл закрыть скобки в своем запросе SwaggerUI следующим образом:

{
    "jobGroup": "Authorizer-CCC",
    "jobName": "Authorizer-2NO5-101"
person Irina    schedule 28.04.2017