【问题标题】:Failed to convert boolean to enum using Jackson无法使用 Jackson 将布尔值转换为枚举
【发布时间】:2021-12-02 06:28:24
【问题描述】:

我在 Springboot 应用程序中有以下 java 类

public enum Status {
    
    DISABLED(false),
    
    ENABLED(true);
    
    private final boolean enabled;
    
    Status(boolean value){
        this.enabled = value;
    }

    public boolean value() {
        return this.enabled;
    }   
    
    /*
    @JsonValue public boolean jsonValue() { return enabled; }
    
    Error: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `com.q.demo.model.Status` from Boolean value (token `JsonToken.VALUE_TRUE`); 
    
    */
    
    /*
    public static Status forValue(@JsonProperty("enabled") Boolean status) {
        if (status == null) {
           return null;
        }
        if (Status.ENABLED.value() == status.booleanValue()) {
              return Status.ENABLED;
        } else {
             return Status.DISABLED;
        }
   }
   
   Error: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Input mismatch reading Enum `com.q.demo.model.Status`: properties-based `@JsonCreator` ([method com.q.demo.model.Status#forValue(java.lang.Boolean)]) expects JSON Object (JsonToken.START_OBJECT), got JsonToken.VALUE_TRUE;
   */

}

public class User {
    
    private Long userId;
    
    private String userName;
    
    private String role;
    
    private String password;
    
    private Status enabled;

    //Getters and setters

}

我想序列化/反序列化下面给出的 json 到枚举

{ “用户名”:“用户名”, “角色”:“角色”, “密码”:“psw”, “启用”:真 }

我没有成功使用@JsonProperty(仅接受字符串)或@JsonValue(在代码中作为注释行给出错误消息)或@Jsconcreator(再次在注释部分给出代码和错误消息。有人可以指点一下?Jackson 版本是2.13.0。谢谢。

【问题讨论】:

    标签: java enums jackson


    【解决方案1】:

    此时您所需要的只是一种告诉 Jackson 从您的枚举转换为您的枚举的方法。您可以在 Status 枚举中组合 @JsonValue@JsonCreator

    @JsonValue
    public boolean value() {
        return this.enabled;
    }
    
    @JsonCreator
    public static Status of(boolean b) {
        return b ? ENABLED : DISABLED;
    }
    

    @JsonValue(在实例方法上)告诉 Jackson 在序列化时使用什么值。该静态方法上的 @JsonCreator 注释告诉杰克逊,从 JSON 中获取的布尔值可用于解析相应的枚举值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 2019-04-07
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2018-12-01
      • 2011-05-19
      • 2011-10-02
      相关资源
      最近更新 更多