如何使用 JSON-B 在生成的 JSON 表示中包含 Java 枚举的字段?

问题描述

假设我有以下 Java 枚举:

@AllArgsConstructor
public enum Code {
    Code1("Short text 1","Long text 1"),Code2("Short text 2","Long text 2");

    private final String shorttext;
    private final String longtext;
}

那么 System.out.println(JsonbBuilder.create().toJson(Code.Code1)) 将导致 ""Code1"。我想得到以下结果:

{
  "shorttext": "Short text 1","longtext": "Long text 1"
}

有没有一种舒适的方法来实现这一目标?也许我可以使用任何注释?还是强制实现自定义Adapter?

顺便说一句:org.json.JSONObject 认会产生所需的格式。

解决方法

我对 JSON-B 不是很熟悉,但您似乎需要按照此处所述编写序列化程序:http://json-b.net/docs/user-guide.html#serializersdeserializers

它可能类似于给出的 Customer 示例。类似的东西:

public static class CodeSerializer implements JsonbSerializer<Code> {
    @Override
    public void serialize(Code code,JsonGenerator generator,SerializationContext ctx) {
        generator.writeStartObject();
        generator.write("shorttext",code.getShorttext());
        generator.write("longtext",code.getLongtext());
        generator.writeEnd();
    }
}
,

您可以使用 Map 来完成,如下所示:

Map<String,String> textMap = new HashMap<>();
textMap.put("longtext",Code.Code1.getLongtext());
textMap.put("shorttext",Code.Code1.getShorttext());
System.out.println(JsonbBuilder.create().toJson(textMap));

输出:{"longtext":"Long text 1","shorttext":"Short text 1"}

此外,您还需要将 @Getter 添加到您的 Code enum