意外的输入结束:OBJECT 的预期关闭标记

Luc*_*lez 5 java search google-app-engine jackson geopoints

我试图在我的应用引擎应用程序中创建一个地理点,但是当我尝试反序列化它时,我收到了这条烦人的消息:

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]).
Run Code Online (Sandbox Code Playgroud)

这是我的 JSON 代码:

{
    "id": 31,
    "name": "pepe",
    "mail": "p@p.com",
    "password": 123,
    "age":10,
    "birthday": "01-06-1991",
    "desc" : " bla bla",
    "gp": {
     "latitude": 64.124596,
     "longitude": -147.8632
     }
}
Run Code Online (Sandbox Code Playgroud)

这是 geopoint 的声明和我的自定义反序列化方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ber 1

看起来你的GeoPoint类有这样的构造函数:public GeoPoint(double latitude, double longitude)。在这种情况下我们可以使用MixIn 功能。我们必须创建额外的抽象类,在其中提供您的POJO和之间的映射JSON

abstract class GeoPointMixIn {

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

    }
}
Run Code Online (Sandbox Code Playgroud)

以及简单的用法:

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

System.out.println(mapper.readValue(JSON, YourRootPojo.class));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您不必为GeoPoint类实现自定义反序列化器。