【问题标题】:How to get the Enum value in serialised JSON from a Java object如何从 Java 对象获取序列化 JSON 中的枚举值
【发布时间】:2020-01-12 22:49:20
【问题描述】:

我有一个在 Java 类中使用的性别枚举(我无法编辑)。现在,当我需要将 Java 类序列化为 JSON 时,我希望 Enum 的值作为 JSON 的一部分,而不是 Enum 名称。例如下面在我的枚举中,当这个枚举被序列化时,我希望值为 {"gender":"Male"} 我正在使用:

String underWritingJSONString = objectMapper.writeValueAsString(myObject);

public enum Gender {
    MALE("Male"),
    FEMALE("Female");

    Gender(String gender) { 
        this.name = gender;
    }
    private String name; 

    String toValue() {
        return name;
    }
}

预期结果 = {"gender":"Male"}

当前结果 = {"gender":"MALE"}

下面是示例类

  public class MyObject {

    @JSONField
    public Gender gender;

    public MyObject() {

    }


    public Gender getGender() {
        return this.gender;
   }
}

【问题讨论】:

  • 如上所述,我无法编辑枚举。它是另一个库的一部分。我需要在使用此枚举的 myObject 类或 ObjectMapper 设置中进行一些更改
  • @ode-master-88 你的枚举没有完成你可以添加/编辑枚举(带有方法的完整声明)因为它接受一个参数,所以应该是一个构造函数,并且有一个 toString 方法有机会吗?

标签: java json spring serialization


【解决方案1】:

你需要添加一个带有注解@JsonValue的方法:

enum Gender {
    MALE("Male"),
    FEMALE("Female");

    Gender(String gender) { // constructor
        this.name = gender;
    }
    private String name; // variable

    @JsonValue
    String toValue() {
        return name;
    }
}

当您将对象序列化为 JSON 时,将调用此方法。

【讨论】:

  • 如上所述,我无法编辑枚举。它是另一个库的一部分。我需要在使用此枚举的 myObject 类或 ObjectMapper 设置中进行一些更改。
  • 它与您上面没有@JsonValue 注释的示例相同
【解决方案2】:

(Jackson 2.6.2 及更高版本)您现在可以简单地编写:

public enum Gender {
 @JsonProperty("Male")
 MALE,
 @JsonProperty("Female")
 FEMALE
  }

【讨论】:

  • 如上所述,我无法编辑枚举。它是另一个库的一部分。我需要在使用此枚举的 myObject 类或 ObjectMapper 设置中进行一些更改
  • 对您有帮助吗? Enum Custom Deserilization
【解决方案3】:

如果枚举有 toString() 方法返回值,那么

mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);

够了。但是您的枚举没有,因为@Dinesh Kondapaneni 提到您应该编写一个自定义序列化程序,例如

class GenderSerializer extends JsonSerializer<Gender> {

@Override
public void serialize(Gender value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    if (null == value) {
    } else {
        try {
            gen.writeString(value.toValue());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}

}

并在你的 MyObject 中使用它作为

@JsonSerialize(using = GenderSerializer.class)
public Gender gender;

仅供参考:我在这里使用杰克逊

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多