从 Java 类生成 JSON 模式

Posted

技术标签:

【中文标题】从 Java 类生成 JSON 模式【英文标题】:Generate JSON schema from Java class 【发布时间】:2014-11-29 17:42:39 【问题描述】:

我有一个 POJO 类:

public class Stock 
 int id;
 String name;
 Date date;

是否有任何注释或开发框架/API 可以将 POJO 转换为 JSON 模式,如下所示:

"id":
                   
        "type" : "int"
      ,
"name":   
        "type" : "string"
       
"date":
        "type" : "Date"
      

我还可以通过在 POJO 上指定一些注释或配置来扩展架构以添加"Required" : "Yes"、每个字段的描述等信息,并且可以生成如下所示的 JSON 架构:

"id":
                   
        "type" : "int",
        "Required" : "Yes",
        "format" : "id must not be greater than 99999",
        "description" : "id of the stock"
      ,
"name":   
        "type" : "string",
        "Required" : "Yes",
        "format" : "name must not be empty and must be 15-30 characters length",
        "description" : "name of the stock"
       
"date":
        "type" : "Date",
        "Required" : "Yes",
        "format" : "must be in EST format",
        "description" : "filing date of the stock"
      

【问题讨论】:

这就是您要找的东西吗? ***.com/questions/9593409/convert-pojo-to-json 不,将 pojo 转换为 json 对象。我正在寻找生成 JSON 模式作为元 [有关映射到 pojo 字段的输入表单字段的信息,如数据类型,是否需要等,] 给最终用户)。 这里是一个在线站点,它将从 json 生成 json 模式:jsonschema.net Tool to generate JSON schema from JSON data 的可能副本 其实我不是在寻找任何工具。我需要一个可以有帮助类或注释的 api 来描述 pojo 中字段的行为。例如。我今天最近发现jackson 2.4.1 有新的注释@JsonPropertyDescription 来将描述添加到pojo 中的字段; [链接]***.com/questions/24515917/….有没有可能通过反射来实现我帖子中的示例? 【参考方案1】:

Jackson JSON Schema 模块就是一个这样的工具:

https://github.com/FasterXML/jackson-module-jsonSchema

它使用 Jackson 数据绑定的 POJO 自省来遍历 POJO 属性,同时考虑到 Jackson 注释,并生成 JSON Schema 对象,然后可以将其序列化为 JSON 或用于其他目的。

【讨论】:

如果您的复杂对象包含需要保持枚举的枚举类型,则您指定的模块不起作用。请参阅下面的答案以获得更好的工具(仍然是杰克逊,但杰克逊映射器。)链接中的说明导致枚举在架构中呈现为简单字符串 是的,我看到了一个错误报告。我希望我们为该模块获得更多的贡献者——它是外部贡献,被广泛使用,但目前还没有专门的所有者。 投反对票...不是因为它是一个糟糕的答案,只是因为它对今天来说是一个糟糕的答案。该库不再维护。【参考方案2】:

Java JSON 模式生成器:https://github.com/victools/jsonschema-generator

使用 Jackson 从 Java 类创建 JSON Schema(Draft 6、Draft 7 或 Draft 2019-09)。

【讨论】:

【参考方案3】:

使用 JJschema。它可以生成符合草案 4 的 JSON 模式。详情请参考这篇帖子http://wilddiary.com/generate-json-schema-from-java-class/。

虽然Jackson Json Schema module 也可以生成架构,但截至目前,它只能生成符合草案 3 的架构。

【讨论】:

github.com/mbknor/mbknor-jackson-jsonSchema 可以根据 Jackson 注解生成 Draft 4 架构【参考方案4】:
public static String getJsonSchema(Class clazz) throws IOException 
         Field[] fields = clazz.getDeclaredFields();
         List<Map<String,String>> map=new ArrayList<Map<String,String>>();
         for (Field field : fields) 
             HashMap<String, String> objMap=new  HashMap<String, String>();
             objMap.put("name", field.getName());
             objMap.put("type", field.getType().getSimpleName());
             objMap.put("format", "");
             map.add(objMap);
         
         ObjectMapper mapper = new ObjectMapper();
         String json = mapper.writeValueAsString(map);

       return json;
    

【讨论】:

以上是关于从 Java 类生成 JSON 模式的主要内容,如果未能解决你的问题,请参考以下文章

是否有通过 Java 从 XML 模式生成 JSON 模式的工具?

从 JSON 生成 Java 类?

如何从 Json 文件生成 Java 类? [复制]

GraphQL Java 类生成器 [关闭]

json模式到目标c - 模型类生成

JPA的模式:从实体生成数据传输对象DTO并将DTO合并到数据库