gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:49:17 24 4
gpt4 key购买 nike

假设我的 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);
}
}

我想用 jackson 反序列化。 Jackson 似乎不喜欢 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'

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

最佳答案

您的 POJO 实现不正确:无参数构造函数未初始化 StringProperty。因此,如果您使用无参数构造函数,然后调用 setMyField(...) 您将收到空指针异常。我猜想尝试解决这个问题是导致您尝试创建自定义反序列化器的原因。

我不完全确定为什么自定义反序列化器会给出它所给出的错误(也许它不喜欢它是一个内部类这一事实:这只是一个猜测)。

以下内容对我来说效果很好,无需任何自定义反序列化:

TestPojo.java:

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;
}

}

测试.java:

package jxtest;

import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

public static void main(String[] args) throws IOException {
TestPojo item = new TestPojo();
item.setMyField1("Test1");
item.setMyField2("Test2");
item.setMyField3(42);

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(item);

System.out.println(json);

TestPojo readBackIn = mapper.readValue(json, TestPojo.class);
System.out.println(readBackIn.getMyField1());
System.out.println(readBackIn.getMyField2());
System.out.println(readBackIn.getMyField3());
}
}

输出:

{"myField1":"Test1","myField2":"Test2","myField3":42}
Test1
Test2
42

使用 jackson-databind 2.8.7。

关于java - Jackson -- 使用自定义反序列化器反序列化 JavaFX StringProperty 类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com