Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换为JSON时如何使用Java Enum属性_Java_Json_Enums_Jackson_Gson - Fatal编程技术网

转换为JSON时如何使用Java Enum属性

转换为JSON时如何使用Java Enum属性,java,json,enums,jackson,gson,Java,Json,Enums,Jackson,Gson,我在将某个Java枚举转换为JSON时遇到了一些困难。我有以下枚举: public enum Color { BLUE("Blue"), RED("Red"); private String colorName; Color(final String colorName) { this.colorName = colorName; } @Override public String toString() { re

我在将某个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注释。fasterxml@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需要
org.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;
        }
    }
}

工作起来很有魅力

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