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

原文 标签 java json jackson json-api

我正在尝试记录我的JSON API。我的API返回Java POJO,并由Jackson进行序列化。我正在编写一个服务,以为每个服务返回示例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 - POJO中用于JSON文档的示例数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088730/

相关文章:

javascript - 使用jquery根据本地存储数据动态创建HTML分区

javascript - 从 javascript 获取外部 JSON 文件 - 本地网站

java - 使用 Jackson 在没有堆栈跟踪的情况下序列化/反序列化异常

java - 在Java中使用绝对路径名

java - 如何在具有多项选择的java swing中创建下拉列表?

java - 包含阿拉伯和西方字符的字符串连接

java - Jackson Object Mapper 从 Java 7 到 Java 8 的版本问题

java - 如何针对多个和/或条件使用Criteria API对象

javascript - 如何让新的 Facebook Javascript SDK 在 IE8 中运行?

android - Jackson JSON 解析器性能