问题描述
假设我有以下 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