gson 将具有属性的Java枚举序列化为json对象

jobtbby3  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(198)

在Java中,向枚举类添加 meta属性是很简单的:

  1. public enum ItemType {
  2. NORMAL("Normal Item", 10, false),
  3. SPECIAL("Special Item", 20, false),
  4. RARE("Rare Item", 30, true);
  5. private final String description;
  6. private final int points;
  7. private final boolean magical;
  8. private ItemType(String description, int points, boolean magical) {
  9. this.description = description;
  10. this.points = points;
  11. this.magical = magical;
  12. }
  13. @Override
  14. public String toString() {
  15. return this.description;
  16. }
  17. public String getDescription() {
  18. return description;
  19. }
  20. public int getPoints() {
  21. return points;
  22. }
  23. public boolean isMagical() {
  24. return magical;
  25. }
  26. }

我希望将这些序列化,但仅在某些rest端点按需进行(即,在枚举名称转换为字符串的情况下,正常的序列化仍应适用:NORMALSPECIALRARE):

  1. {
  2. "_enum": "NORMAL",
  3. "description": "Normal Item",
  4. "points": 10,
  5. "magical": false
  6. }

有没有什么方法可以注解我的枚举,这样gson或莫希就可以生成这样的json对象?有没有其他的解决方案?

4bbkushb

4bbkushb1#

我不认为有一个通用的解决方案可以覆盖所有的情况,或者所有的库,但是这将是一个针对gson的解决方案

  1. class ItemTypeAdapter extends TypeAdapter<ItemType> {
  2. private final String ENUM_ID = "_enum";
  3. @Override
  4. public void write(JsonWriter writer, ItemType itemType) throws IOException {
  5. writer.beginObject();
  6. writer.name(ENUM_ID).value(itemType.name());
  7. writer.name("description").value(itemType.getDescription());
  8. writer.name("points").value(itemType.getPoints());
  9. writer.name("magical").value(itemType.isMagical());
  10. writer.endObject();
  11. }
  12. @Override
  13. public ItemType read(JsonReader reader) throws IOException {
  14. String itemType = null;
  15. reader.beginObject();
  16. while (reader.hasNext()) {
  17. String name = reader.nextName();
  18. if (name.equals(ENUM_ID)) {
  19. itemType = reader.nextString();
  20. } else {
  21. reader.skipValue();
  22. }
  23. }
  24. reader.endObject();
  25. if (itemType != null) {
  26. return ItemType.valueOf(itemType);
  27. } else {
  28. throw new JsonParseException("Missing '" + ENUM_ID + "' value");
  29. }
  30. }
  31. }

或者,您可以使用定制的JsonSerializer resp. JsonDeserializer。要使用它,您需要在构建gson对象时将其注册为定制类型适配器。

展开查看全部

相关问题