我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举
public enum Event {
FORGOT_PASSWORD("forgot password");
private final String value;
private Event(final String description) {
this.value = description;
}
@JsonValue
final String value() {
return this.value;
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个@JsonValue,这似乎完成了将对象序列化为:
{"event":"forgot password"}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试反序列化时,我得到了一个
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.globalrelay.gas.appsjson.authportal.Event from String value 'forgot password': value not one of declared Enum instance names
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我正在尝试并且没有用Jackson 2.5.4反序列化枚举,我在那里看不到我的情况.我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定.
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum Status {
READY("ready"),
NOT_READY("notReady"),
NOT_READY_AT_ALL("notReadyAtAll");
private static Map<String, Status> FORMAT_MAP = Stream
.of(Status.values())
.collect(toMap(s -> s.formatted, Function.<Status>identity()));
private final String formatted;
Status(String formatted) {
this.formatted = formatted;
}
@JsonCreator
public Status fromString(String string) {
Status status = FORMAT_MAP.get(string);
if (status == null) {
throw new IllegalArgumentException(string + " has no corresponding value");
}
return status;
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过@JsonValue一个无用的吸气剂,这是我在别处看到的一个选项.他们都爆炸了:
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of ...Status from String value 'ready': value not …Run Code Online (Sandbox Code Playgroud) 我有一个JSON对象,如:
{"name":"John", "grade":"A"}
Run Code Online (Sandbox Code Playgroud)
要么
{"name":"Mike", "grade":"B"}
Run Code Online (Sandbox Code Playgroud)
要么
{"name":"Simon", "grade":"C"}
Run Code Online (Sandbox Code Playgroud)
等等
我试图将上面的JSON映射到:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Employee{
@JsonIgnoreProperties(ignoreUnknown = true)
public enum Grade{ A, B, C }
Grade grade;
String name;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的映射工作正常,但将来会有更多的"等级"类型,比如D,E等打破现有的映射并抛出以下异常
05-08 09:56:28.130: W/System.err(21309): org.codehaus.jackson.map.JsonMappingException: Can not construct instance of Employee from String value 'D': value …Run Code Online (Sandbox Code Playgroud) 我试图使用Jackson将JSON反序列化为Java POJO.在不泄露机密信息的情况下,这是ObjectMapper反序列化失败时的示例堆栈跟踪:
org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class
Run Code Online (Sandbox Code Playgroud)
我的JSON看起来像这样:
"foo": {
"coins": null,
...
}
Run Code Online (Sandbox Code Playgroud)
我要反序列化的类有这个字段:
private Map<MyEnum, MyPojo> foo;
Run Code Online (Sandbox Code Playgroud)
我的枚举类型看起来像这样:
public enum MyEnum {
COINS("coins"),
...
}
Run Code Online (Sandbox Code Playgroud)
我确实意识到我正在尝试反序列化null值.但我相信这仍然有效:反序列化的结果应该等同于使用Map foo.put(MyEnum.COINS, null),这确实是一个有效的Java指令.非常感谢帮助,在此先感谢.