【问题标题】:How can I use a property of Java Enum when converting to JSON转换为 JSON 时如何使用 Java Enum 的属性
【发布时间】:2016-01-11 17:16:50
【问题描述】:

我在将某个 Java 枚举转换为 JSON 时遇到了一些困难。我有以下枚举:

public enum Color {
    BLUE("Blue"), RED("Red");
    private String colorName;

    Color(final String colorName) {
        this.colorName = colorName;
    }

    @Override
    public String toString() {
        return colorName;
    }
}

在转换为 JSON 时,我想使用名称,因此我重写了 toString 方法。我认为这就足够了,但是当我做这个测试时:

Gson gson = new Gson();
assertEquals("Blue", gson.toJson(Color.BLUE));

失败了!它给了我“蓝色”...有什么办法可以让这个东西返回“蓝色”?

我还在一个返回名称但没有结果的方法上尝试了@JsonValue 注释。 fastxml @JsonFormat 也没有给我任何东西...

【问题讨论】:

    标签: java json enums jackson gson


    【解决方案1】:

    首先,即使不是原因,也要避免命名属性名称。

    否则,像这样更改您的代码,它会起作用。

    public enum Color {
    @SerializedName("Blue") BLUE("Blue"),
    @SerializedName("Red") RED("Red");
        private String name;
    
        Color(final String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return name;
        }
    }
    

    【讨论】:

    • name 字段是虚构的,我将在示例代码中对其进行更改。是否有可能在整个类上使用例如“当您尝试获取名称时,返回此字段”之类的注释?
    • 我不这么认为,但你可以创建它,这是个好主意!我的回答对你有用吗?
    • 它可能有效,但我认为这是一个丑陋的解决方案。我正在寻找像“@JsonValue”或“@JsonFormat”这样的注释,但我不明白为什么它们不起作用。
    • 尝试创建自己的
    • 如果您对答案满意,可以接受吗?
    【解决方案2】:

    @JsonValue 在返回名称以使用的方法上确实有效。只要确保您没有意外使用错误的 Jackson 注释(Jackson 2.x 需要来自 com.fasterxml.jackson.annotation 的注释;Jackson 1.x 需要来自 org.codehaus.jackson 的注释)。另外,如果您使用的是旧的 Jackson 版本,请尝试升级;我认为在 2.4 左右添加了对 @JsonValue 的支持。

    【讨论】:

      【解决方案3】:

      我自己找到了解决方案,但 StaxMan 让我坚持尝试:)

      我所做的是从 Jackson 2.x 添加注释,但在我的测试中,我使用 Gson 转换为 json。这些不能一起玩。因此,当您使用 Jackson 定义 json 输出时,也可以使用 Jackson 将您的对象转换为 json:

      public class ColorTest {
      
          @Test
          public void convertToJson() throws JsonProcessingException {
              ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
              String json = ow.writeValueAsString(Colors.BLUE);
              assertEquals("\"blue\"", json);
          }
      
          private enum Colors {
              RED("red"), BLUE("blue");
      
              private String colorName;
      
              Colors(final String colorName) {
                  this.colorName = colorName;
              }
      
              @JsonValue
              @Override
              public String toString() {
                  return colorName;
              }
          }
      }
      

      像魅力一样工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多