Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson反序列化枚举字段_Java_Jackson_Objectmapper - Fatal编程技术网

Java 使用Jackson反序列化枚举字段

Java 使用Jackson反序列化枚举字段,java,jackson,objectmapper,Java,Jackson,Objectmapper,我有一个简单的枚举 公众普查日{ @JsonPropertyMonday 星期一星期一, @JsonPropertyTuesday 星期二星期二; 私人弦日; 星期六{ this.day=天; } @JsonValue 公共字符串getDay{ 回归日; } } 还有一个班级活动 公开课活动{ 私人日; 私有字符串名称; @JsonCreator 平民的Event@JsonPropertyday日复一日, @JsonPropertyname字符串名称{ this.day=天; this.name

我有一个简单的枚举

公众普查日{ @JsonPropertyMonday 星期一星期一, @JsonPropertyTuesday 星期二星期二; 私人弦日; 星期六{ this.day=天; } @JsonValue 公共字符串getDay{ 回归日; } } 还有一个班级活动

公开课活动{ 私人日; 私有字符串名称; @JsonCreator 平民的Event@JsonPropertyday日复一日, @JsonPropertyname字符串名称{ this.day=天; this.name=名称; } 公众日{ 回归日; } 公共字符串getName{ 返回名称; } } 我正在使用Jackson 2.9,并指出使用@JsonProperty应该足够了,但是我很难反序列化它:

public static void mainString[]args引发JsonProcessingException{ ObjectMapper ObjectMapper=新的ObjectMapper; 事件=新事件天。星期一,生日; 字符串serialisedEvent=objectMapper.WriteValueAsString事件; System.out.printlnserialisedEvent; //{日期:星期一,姓名:生日} Event deserialisedEvent=objectMapper.convertValueserialisedEvent,Event.class; //主线程java.lang.IllegalArgumentException中出现异常:无法构造'xyz.blabla.Event'的实例,尽管至少存在一个创建者:没有字符串参数构造函数/工厂方法从字符串值{day:Monday,name:Birthday}反序列化 //位于[来源:未知;行:-1,列:-1] //位于com.fasterxml.jackson.databind.ObjectMapper.\u convertObjectMapper.java:3750 System.out.PrintLnDeserializedEvent.getDay; }
我正在SpringBoot2项目中使用Java11和Jackson2.9。如何使其工作?

您没有默认构造函数,只有arg构造函数

您必须使用@JsonCreator对其进行注释,以便Jackson使用它来反序列化JSON:

@JsonCreator 
public Event(Days day, String name) {
    this.day = day;
    this.name = name;
}
为了将Java对象序列化为JSON,Jackson不使用构造函数,因为它不创建Java实例,而只是使用getter来检索它的属性。所以它成功了。 但要将JSON取消序列化为Java对象,Jackson需要实例化目标类。默认情况下,它查找无参数构造函数

还请注意,用@JsonProperty注释构造函数参数。。。如果使用,则不需要,例如:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new ParameterNamesModule());
SpringBoot2为您提供了它,因为您依赖Jackson。 这里您需要它,因为您不使用SpringBoot的映射器连接,而是自己实例化它

也不需要位于枚举中的@JsonProperty注释:

public enum Days {
    @JsonProperty("Monday")
    MONDAY("Monday"),
    @JsonProperty("Tuesday")
    TUESDAY("Tuesday");
    //...
}

它允许更改枚举的序列化输出,但实际上,当您将其映射到当前用于枚举映射的day字段值时,不需要更改它

Jackson反序列化方法称为readValue

convertValue的用途不同——它序列化一个可能是字符串的对象——首先它将成为JSON字符串文本,然后将结果反序列化为目标类型的对象

以下方面应起作用:

Event deserialisedEvent = objectMapper.readValue(serialisedEvent, Event.class);

为了补充这个答案,我浏览了互联网,寻找如何添加一次性枚举值,并将其与破折号一起保存。注意:枚举不允许破折号。我通过简单地添加

@JsonProperty("ONE-TIME")
在枚举字段声明上方