Jackson - 使用自定义反序列化器反序列化JavaFX StringProperty类型字段

时间:2017-03-30 22:28:08

标签: java javafx jackson

假设我的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'

这就是与此代码相关的所有内容。

1 个答案:

答案 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。