假设我的POJO仅限于以下内容:
public class TestPojo {
StringProperty myField;
public TestPojo(){}
public TestPojo(String myField) {
this.myField = new SimpleStringProperty(myField);
}
public String getMyField() {
return this.myField.get();
}
public StringProperty myFieldProperty() {
return this.myField;
}
public void setMyField(String myField) {
this.myField.set(myField);
}
}
我想和杰克逊一起反序列化。杰克逊似乎不喜欢StringProperty,因为作为普通的String,它按预期工作。所以我写了一个自定义反序列化器......
public class StringPropertyDeserializer extends JsonDeserializer<StringProperty> {
public StringPropertyDeserializer() {}
@Override
public StringProperty deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String value = jsonParser.readValueAs(String.class);
return new SimpleStringProperty(value);
}
}
我将这个注释添加到我的StringProperty字段......
@JsonDeserialize(using = StringPropertyDeserializer.class)
我收到以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Class com.test.example.TestPojo$StringPropertyDeserializer has no default (no arg) constructor
我在反序列化程序中添加了一个默认构造函数(如上所示),无论是否存在,我都会得到相同的错误。有解决方案吗这似乎应该很简单。
这里编辑的是我正在拨打电话的实际代码,如果这有用的话......
@GET("/api/test")
Call<List<TestPojo>> testPojoCall();
它在Gradle中配置如下:
compile group: 'com.squareup.retrofit2', name: 'converter-jackson', version: '2.1.0'
这就是与此代码相关的所有内容。
答案 0 :(得分:1)
您的POJO实现不正确:无参数构造函数不初始化node
。因此,如果使用no-arg构造函数,则调用node * insertAfter(node * top, int value)
{
node * temp = new node;
temp->item = value;
temp->next = nullptr; // so we know there is nothing next.
// But what if there is something next? Hmmm....
temp->prev = top; // point back at top
top->next = temp; // point at temp, but what if next already pointed at something?
// Wowzers! This is harder than it looks!
return temp; // return the new node so caller can do something with it if they want
}
,您将获得空指针异常。我猜测试图解决这个问题导致你尝试创建自定义反序列化器。
我不完全确定为什么自定义反序列化器会给出它给出的错误(也许它不喜欢它是一个内部类的事实:这只是猜测)。
以下工作正常,没有任何自定义反序列化:
TestPojo.java:
StringProperty
Test.java:
setMyField(...)
输出:
package jxtest;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class TestPojo {
private final StringProperty myField1 = new SimpleStringProperty();
private final StringProperty myField2 = new SimpleStringProperty();
private int myField3 ;
public final StringProperty myField1Property() {
return this.myField1;
}
public final String getMyField1() {
return this.myField1Property().get();
}
public final void setMyField1(final String myField1) {
this.myField1Property().set(myField1);
}
public final StringProperty myField2Property() {
return this.myField2;
}
public final String getMyField2() {
return this.myField2Property().get();
}
public final void setMyField2(final String myField2) {
this.myField2Property().set(myField2);
}
public int getMyField3() {
return myField3;
}
public void setMyField3(int myField3) {
this.myField3 = myField3;
}
}
使用jackson-databind 2.8.7。