在Java中是否可以将枚举名称和值一起返回?

时间:2019-07-03 15:17:20

标签: java json spring-mvc enums jackson

是否可以将ENUM名称和标签放在一起? 喜欢:

[
    {"COMBUSTIVEL", "Combustível"},
    {"TROCADEOLEO", "Troca de Óleo"},
    {"PNEUDIANTEIRO", "Pneu Dianteiro"},
    {"PNEUTRASEIRO", "Pneu Traseiro"},
    {"CORRENTE", "Corrente"},
    {"RELACAO", "Relação"}
]

我正在使用Spring MVC,但我认为这无关紧要。

我尝试覆盖toString()方法,但不幸的是它没有用。

我的代码:

public enum Categoria {
    COMBUSTIVEL("Combustível"), 
    TROCADEOLEO("Troca de óleo"), 
    PNEUDIANTEIRO("Pneu dianteiro"), 
    PNEUTRASEIRO("Pneu traseiro"), 
    CORRENTE("Corrente"), 
    RELACAO("Relação");

    private String label;

    Categoria(String item){
        this.label = item;
    }

    public String getLabel(){
        return this.label;
    }

    @Override
    public String toString() {
        return this.label;
    }

    public String[][] getList(){
        Categoria[] values = Categoria.values();

        return ?;
    }

}

结果是:

[
    "COMBUSTIVEL",
    "TROCADEOLEO",
    "PNEUDIANTEIRO",
    "PNEUTRASEIRO",
    "CORRENTE",
    "RELACAO"
]

4 个答案:

答案 0 :(得分:2)

您有多种实现方式。您可以简单地返回名称为键,标签为值的地图:

public static Map<String, String> getList() {
    return Arrays.stream(Categoria.values())
            .collect(Collectors.toMap(Categoria::name, Categoria::getLabel));
}

如果您想使用嵌套数组,可以使用以下方法:

public static String[][] getList() {
    return Arrays.stream(Categoria.values())
            .map(c -> new String[] {c.name(), c.getLabel()})
            .toArray(String[][]::new);
}

另一种选择是将枚举映射到自定义对象或创建自定义序列化器。

答案 1 :(得分:1)

可以这样做:

        public static String[][] getList(){
            Categoria[] values = Categoria.values();

            String[][] result = new String[values.length][2]; 

            for (int i = 0; i < values.length; ++i) {
                String[] pair = {values[i].name(), values[i].toString()};
                result[i] = pair;
            }

            return result;
        }

答案 2 :(得分:0)

首先将toString方法更改为

@Override
public String toString() {
    return name() + ", " + getLabel();
}

然后更改您的getList()

public String[][] getList(){
    Categoria[] values = Categoria.values();
    List<String> resultList = new ArrayList<>();
    for(Categoria value : values) {
      resultList.add(value.toString);
    }
    return resultList.toArray();
}

答案 3 :(得分:0)

尝试简单得多:

public enum Categoria {
    COMBUSTIVEL("Combustível"), TROCADEOLEO("Troca de óleo"), PNEUDIANTEIRO("Pneu dianteiro"),
    PNEUTRASEIRO("Pneu traseiro"), CORRENTE("Corrente"), RELACAO("Relação");

    private String label;

    Categoria(String item) {
        this.label = item;
    }

    public String getLabel() {
        return this.label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public static String myText() {
        StringBuffer str = new StringBuffer("");
        int i = 0;
        Categoria[] categoria = Categoria.values();
        str.append("[\n");
        for(Categoria c : categoria) {
            str.append("\t{\""+c.getLabel()+"\", \""+categoria[i].name()+"\"}");
            if((i + 1) < categoria.length) {
                str.append(",\n");
            }
            i++;
        }
        str.append("\n]");

        return str.toString();        
    }
}

public class Test {

    public static void main(String[] args) {
        System.out.println(Categoria.myText());
    }
}

输出:

[
    {"Combustível", "COMBUSTIVEL"},
    {"Troca de óleo", "TROCADEOLEO"},
    {"Pneu dianteiro", "PNEUDIANTEIRO"},
    {"Pneu traseiro", "PNEUTRASEIRO"},
    {"Corrente", "CORRENTE"},
    {"Relação", "RELACAO"}
]