相关疑难解决方法(0)

Jackson enum Serializing和DeSerializer

我正在使用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)

我在这里错过了什么?

java enums jsonserializer jackson

208
推荐指数
11
解决办法
22万
查看次数

用杰克逊对enum进行反序列化

我正在尝试并且没有用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)

java json jackson

50
推荐指数
5
解决办法
6万
查看次数

如何忽略Jackson JSON-to-Object映射中的枚举字段?

我有一个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)

java jackson

16
推荐指数
4
解决办法
2万
查看次数

杰克逊用Enum Key,POJO值反序列化到Map中

我试图使用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指令.非常感谢帮助,在此先感谢.

java serialization json jsonserializer jackson

7
推荐指数
3
解决办法
1万
查看次数

标签 统计

jackson ×4

java ×4

json ×2

jsonserializer ×2

enums ×1

serialization ×1