簡體   English   中英

傑克遜解析類不起作用

[英]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);
    }
}

僅供參考,我正在使用JacksonLombok

    <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只是一個標准

  1. 所有私有屬性(使用獲取器/設置器)
  2. 一個公開的無參數構造函數
  3. 實現可序列化。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM