【问题标题】:How to include the fields of a Java enum in the resulting JSON representation with JSON-B?如何使用 JSON-B 在生成的 JSON 表示中包含 Java 枚举的字段?
【发布时间】:2021-04-23 06:18:00
【问题描述】:

假设我有以下 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"
}

有没有一种舒适的方法来实现这一点?也许我可以使用任何注释?还是必须实现自定义适配器?

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

【问题讨论】:

    标签: java json jsonb-api


    【解决方案1】:

    我对 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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 2017-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多