nis*_*ant 8 java serialization jackson deserialization
我有一堂课,看起来像
class MyClass {
private byte[] payload;
public MyClass(){}
@JsonCreator
public MyClass(@JsonProperty("payload") final byte[] payload) {
this.payload = payload;
}
public byte[] getPayload() {
return this.payload;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Jackson,因此先序列化然后反序列化。序列化工作正常,但是在反序列化期间,我收到此错误消息-
Cannot construct instance of `mypackage.MyClass` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Run Code Online (Sandbox Code Playgroud)
我在网上阅读有关此问题的信息,遇到了几本建议使用默认构造函数或带@JsonCreator注释的构造函数的文章。我尝试将两者都添加,但仍然遇到该异常。我在这里想念什么?
cod*_*oda 13
基本都添加了
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)
装饰器,它对我有用。
fla*_*nze 12
编辑:
我刚刚找到了一个更好的解决方案,将ParanamerModule添加到ObjectMapper:
mapper.registerModule(new ParanamerModule());
Run Code Online (Sandbox Code Playgroud)
马文:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-paranamer</artifactId>
<version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
与ParameterNamesModule相比的优势似乎是类不需要使用-parameters参数进行编译。
结束编辑
在 Jackson 2.9.9 中,我尝试反序列化这个简单的 POJO 并出现相同的异常,添加一个默认构造函数解决了这个问题:
POJO:
public class Operator {
private String operator;
public Operator(String operator) {
this.operator = operator;
}
public String getOperator() {
return operator;
}
}
Run Code Online (Sandbox Code Playgroud)
ObjectMapper 和序列化/反序列化:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.ANY);
String value = mapper.writeValueAsString(new Operator("test"));
Operator result = mapper.readValue(value, Operator.class);
Run Code Online (Sandbox Code Playgroud)
JSON:
{"operator":"test"}
Run Code Online (Sandbox Code Playgroud)
例外:
com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot construct instance of `...Operator` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"operator":"test"}"; line: 1, column: 2]
Run Code Online (Sandbox Code Playgroud)
解决方案(具有默认构造函数的 POJO):
public class Operator {
private String operator;
private Operator() {
}
public Operator(String operator) {
this();
this.operator = operator;
}
public String getOperator() {
return operator;
}
}
Run Code Online (Sandbox Code Playgroud)
And*_*mer 11
我观察到了同样的问题。我的问题是由我使用错误的JsonCreator 类型引起的。我错误地使用了org.codehaus.jackson.annotate.JsonCreator,但应该使用com.fasterxml.jackson.annotation.JsonCreator代替。
小智 8
在您的子类对象中添加默认构造函数:
public NameOfClass() {
super();
}
Run Code Online (Sandbox Code Playgroud)
我遇到了这个序列化和反序列化kotlin data classes。我所要做的就是为我的属性添加默认值,然后读取有效的值。
data class DataClass(
val key: String = "", // adding these default
val value: String = "" // values worked
)
Run Code Online (Sandbox Code Playgroud)
如果没有= "",我会收到错误:
Cannot construct instance of `com.xxx.DataClass` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8145 次 |
| 最近记录: |