关于jackson:从java类生成JSON模式

Generate JSON schema from java class

我有一个波卓班

1
2
3
4
5
public class Stock{
 int id;
 String name;
 Date date;
}

是否有可以将pojo转换为json模式的注释或开发框架/api,如下所示

1
2
3
4
5
6
7
8
9
10
11
{"id":
      {            
       "type" :"int"
      },
"name":{  
       "type" :"string"
       }
"date":{
       "type" :"Date"
      }
}

此外,我还可以通过在POJO上指定一些注释或配置来扩展模式以添加诸如"Required":"Yes"、每个字段的描述等信息,并可以生成下面这样的JSON模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{"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"
      }
}


我自己也遇到了这样的需求,但需要获得最新的模式规范(本文中的v4)。我的解决方案是以下链接的第一个答案:从带有扭曲的POJO生成JSON模式

使用org.codehaus.jackson.map包中的对象,而不是com.fasterxml.jackson.databind包中的对象。如果你按照这一页上的说明做,那你就错了。只需使用杰克逊映射器模块。

以下是未来谷歌的代码:

1
2
3
4
5
6
7
8
9
private static String getJsonSchema(Class clazz) throws IOException {
    org.codehaus.jackson.map.ObjectMapper mapper = new ObjectMapper();
    //There are other configuration options you can set.  This is the one I needed.
    mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true);

    JsonSchema schema = mapper.generateJsonSchema(clazz);

    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
}


其中一个工具是Jackson JSON模式模块:

https://github.com/fasterxml/jackson-module-jsonschema

它使用Jackson DataBind的POJO自省来遍历POJO属性,同时考虑到Jackson注释,并生成一个JSON模式对象,然后将其序列化为JSON或用于其他目的。


使用JJSchema。它可以生成符合草案4的JSON模式。有关详细信息,请参阅http://wilddiary.com/generate-json-schema-from-java-class/。

尽管Jackson JSON模式模块也可以生成模式,但到目前为止,它只能生成符合草案3的模式。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
    }