簡體   English   中英

轉換為JSON時如何使用Java Enum的屬性

[英]How can I use a property of Java Enum when converting to JSON

在將某個Java Enum轉換為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也給我什么...

首先,即使不是原因,也請避免命名屬性名稱。

否則,請像這樣更改您的代碼,它將起作用。

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;
    }
}

返回名稱以使用的方法上的@JsonValue確實起作用。 只要確保您不會意外使用錯誤的Jackson批注(Jackson 2.x需要com.fasterxml.jackson.annotation批注;而Jackson 1.x則需要com.fasterxml.jackson.annotationorg.codehaus.jackson )。 另外,如果您使用的是舊版Jackson,請嘗試升級;否則,請執行以下步驟。 我認為對@JsonValue支持是在2.4左右添加的。

我自己找到了解決方案,但是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;
        }
    }
}

奇跡般有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM