[英]Jackson's @JsonPropertyOrder doesn't work with @JsonUnwrapped
[英]Jackson Parsing Class doesn't work
我指的是本教程,以學習Jackson的基礎知識,但是卻陷入了困境。
這是例外:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `hello.Car` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"color":"Black","type":"BMW"}"; line: 1, column: 2]
這是課程 :
@Builder
@Data
@AllArgsConstructor
public class Car implements Serializable {
private String color;
private String type;
}
這是解析邏輯:
@Service
public class HelloService {
public void testJackson() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json1 = "{\"color\":\"Black\",\"type\":\"BMW\"}";
Car car1 = objectMapper.readValue(json1, Car.class);
}
}
僅供參考,我正在使用Jackson和Lombok :
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
這到底是怎么回事。 請分享一些想法。
更新 2018-05-10 @Hemant Patel,謝謝。 剛剛添加了@NoArgsConstructor
,就像魔術一樣。 它按預期工作。 我將對其進行調查,以了解實際情況。
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car implements Serializable {
String color;
String type;
}
順便說一句,謝謝@Thomas和@Alex,我檢查了這兩篇文章,但我真的不認為真正的原因在於與Lombok的關系 。
經過長時間的搜索,我從其官方API 文檔中發現了這一點:
公共ObjectMapper()
默認構造函數將根據需要構造默認的JsonFactory,將SerializerProvider用作其SerializerProvider,並將BeanSerializerFactory用作其SerializerFactory。 這意味着它可以序列化所有標准JDK類型以及常規Java Bean (基於方法名稱和Jackson特定的注釋),但是不支持JAXB注釋。
我們知道,什么是在Java Beans(基於此職位 ):
JavaBean只是一個標准
- 所有私有屬性(使用獲取器/設置器)
- 一個公開的無參數構造函數
- 實現可序列化。
Jackson需要使用默認的構造函數,setter和gettes才能將json轉換為類。 將您的汽車類別更改為
public class Car implements Serializable {
private String color;
private String type;
public Car() {
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.