如何在Java中从枚举值返回具有所有属性的枚举对象

3
我得到了一个场景,要以json格式返回 Status Enum 中可用的状态列表,我的枚举如下所示。
例如:
public enum Status {

CREATED("100", "CREATED"), UPDATED("200", "UPDATED"), DELETED("300", "DELETED");

private final String id;
private final String name;

private Status(String id, String name) {
    this.id = id;
    this.name = name;
}

public String getId() {
    return id;
}

public String getName() {
    return name;
}

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

public List<Map<String, String>> lookup() {
    List<Map<String, String>> list = new ArrayList<>();
    for (Status s : values()) {
        Map<String, String> map = new HashMap<>();
        map.put("ID", s.getId());
        map.put("name", s.getName());
        list.add(map);
    }
    return list;

}
}

需要输出如下所示:

[{id:"100",name:"CREATED"},{id:"200", name:"UPDATED"}...] 我已经编写了使用映射列表构建响应的查找方法,是否有更好的方法或实用程序将枚举转换为具有枚举中所有可用属性的对象。

有没有更好的方法来做这个?

4个回答

2
你可以使用Jackson将其转换为JSON。只需在枚举声明中包含@JsonFormat(shape = Shape.OBJECT)。这样应该会给你想要的结果。

1
你可以使用类似于GsonJackson的JSON序列化库,并在其中实现自定义序列化。
例如,Gson自定义序列化器
class StatusSerializer implements JsonSerializer<Status> {
    public JsonElement serialize(Status status, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject object = new JsonObject();
        object.addProperty("ID", status.getId());
        object.addProperty("name", status.getName());
        return object;
    }
}

你可以将其用作如下方式:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Status.class, new StatusSerializer())
        .create();
String json = gson.toJson(Status.CREATED);

产生以下结果:
{"ID":"100","name":"CREATED"}

1
你可以在Java 8中使用Stream API,并使用parallel以获得更好的性能。
List<Map<String, String>> list = Stream.of(Status.values()).parallel().map(temp -> {
        Map<String, String> obj = new HashMap<String, String>();
        obj.put("id", temp.getId());
        obj.put("name", temp.getName());
        return obj;
    }).collect(Collectors.toList());

1
在这里使用 parallel() 只会降低性能 - 详见例如 这个很好的答案 - Tomasz Linkowski
@TomaszLinkowski,真的,让我来参加测试吧。我没有使用过太多的Stream API。谢谢你的评论。 - VuNT
1
不用谢。请记住,要正确运行这样的微基准测试,您需要使用类似于Java Microbenchmark Harness的工具。 - Tomasz Linkowski

0
Arrays.stream( Status.class.getEnumConstants() )
   .map( e -> Map.of( "id", e.getId(), "name", e.getName() )
   .collect( Collectors.toList() );

我在手机上,无法测试,但你可以大致了解意思


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接