杰克逊解析 Class 不起作用

Jackson Parsing Class doesn't work

我指的是这个 tutorial 来学习 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]

这是class:

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

F.Y.I 我正在使用 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;
}

B.T.W 谢谢@Thomas 和@Alex,我检查了这两个帖子,但我真的不认为真正的原因 在于Lombok 的关系

Jackson 需要默认构造函数、setter 和 gettes 来进行 json 到 class 的转换。将您的汽车 class 更改为

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

经过长时间的搜索,我从官方找到了这个 API documentation:

public ObjectMapper()

Default constructor, which will construct the default JsonFactory as necessary, use SerializerProvider as its SerializerProvider, and BeanSerializerFactory as its SerializerFactory. This means that it can serialize all standard JDK types, as well as regular Java Beans (based on method names and Jackson-specific annotations), but does not support JAXB annotations.

据我们所知,什么是Java Beans(基于此post):

A JavaBean is just a standard

  1. All properties private (use getters/setters)
  2. A public no-argument constructor
  3. Implements Serializable.