java - JSON 文档 POJO 中的示例数据

标签 java json jackson json-api

我正在尝试记录我的 JSON API。我的 API 返回由 Jackson 序列化的 Java POJO。我正在编写一个服务来返回每个服务的示例 JSON。我想做的是这样的:

class MyPojo {

  @Example("Bob")
  public String name;

  @Example(42)
  public Integer myInt;

  public String noExample;

}

我需要一些方法让 jackson 将其序列化为:

{
"name": "Bob",
"myInt": 42
"noExample": "string"
}

当我需要一个例子时。

实现这一目标的最简单方法是什么?

最佳答案

您可以考虑使用ObjectMapper.acceptJsonFormatVisitor方法来访问bean类的元信息。 the Jackson JSON schema module中使用了类似的方法。用于模式生成。

这是一个演示这个想法的示例:

public class JacksonSchema1 {
    @Retention(RetentionPolicy.RUNTIME)
    public static @interface Example {
        String value();
    }

    public static class MyPojo {
        @Example("Bob")
        public String name;

        @Example("42")
        public Integer myInt;

        public String noExample;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        MyJsonFormatVisitorWrapper visitor = new MyJsonFormatVisitorWrapper(mapper);
        mapper.acceptJsonFormatVisitor(MyPojo.class, visitor);
        System.out.println(mapper.writeValueAsString(visitor.getExample()));
    }

    private static class MyJsonFormatVisitorWrapper implements JsonFormatVisitorWrapper {
        private final ObjectMapper mapper;
        private final Map<String, Object> example = new LinkedHashMap<>();

        private MyJsonFormatVisitorWrapper(ObjectMapper mapper) {
            this.mapper = mapper;
        }

        @Override
        public JsonObjectFormatVisitor expectObjectFormat(JavaType type) throws JsonMappingException {
            return new JsonObjectFormatVisitor.Base() {
                @Override
                public void optionalProperty(BeanProperty prop) throws JsonMappingException {
                    Example a = prop.getAnnotation(Example.class);
                    if (a != null) {
                        example.put(prop.getName(), mapper.convertValue(a.value(), prop.getType()));
                    } else {
                        example.put(prop.getName(), prop.getType().toCanonical());
                    }
                }
            };
        }

        @Override
        public JsonArrayFormatVisitor expectArrayFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonStringFormatVisitor expectStringFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonNumberFormatVisitor expectNumberFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonIntegerFormatVisitor expectIntegerFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonBooleanFormatVisitor expectBooleanFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonNullFormatVisitor expectNullFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonAnyFormatVisitor expectAnyFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public JsonMapFormatVisitor expectMapFormat(JavaType type) throws JsonMappingException {
            return null;
        }

        @Override
        public SerializerProvider getProvider() {
            return null;
        }

        @Override
        public void setProvider(SerializerProvider provider) {

        }

        public Map<String,Object> getExample() {
            return example;
        }
    }
}

输出:

{"name":"Bob","myInt":42,"noExample":"java.lang.String"}

关于java - JSON 文档 POJO 中的示例数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088730/

相关文章:

java - 使用 jackson 解码 json 时的验证

java - Jackson: Map<String, Object> 序列化和反序列化

java - Spring RequestBody 将 JSON 字符串映射到 Point2D 坐标

java - Collections.sort() 在大型 ArrayList 中失败,经常排序

java - 在scala中,如何提取DynamicVariable中的值?

Java Date 获取 CE 年份

php - 迁移后无法执行批量操作

c# - 我可以使用 Newtonsoft.Json 进行严格的反序列化吗?

java - 使用 AmazonSNSClient 发送短信时的授权

json - 修剪字符串末尾的最后一个字符