public static void main(String[] args) throws Exception {
generateJsonPath();
}
public static void generateJsonPath() throws Exception {
Map<String, Object> data = new HashMap<>();
data.put("list", new Stu[]{new Stu("xxxx", System.currentTimeMillis())});
data.put("obj", new Stu("cc", System.currentTimeMillis()));
ObjectMapper mapper = new ObjectMapper();
JsonSchemaInferrer inferrer = JsonSchemaInferrer.newBuilder()
.setSpecVersion(SpecVersion.DRAFT_04)
.setAdditionalPropertiesPolicy(AdditionalPropertiesPolicies.noOp())
.setRequiredPolicy(RequiredPolicies.noOp())
.build();
// System.out.println(JsonUtils.toJSONString(data));
JsonNode objectNode = inferrer.inferForSample(mapper.readTree(JsonUtils.toJSONString(data)));
System.out.println(objectNode.toString());
List<PathInfo> pathInfoList = new ArrayList<>();
Map<String, PathInfo> pathInfoMap = new HashMap<>();
PathInfo rootNode = new PathInfo(UUID.randomUUID().toString(), "-1", "$", "$", objectNode.get("type").asText());
if ("array".equals(rootNode.getType())) {
rootNode.setPath(rootNode.getPath() + "[]");
}
pathInfoList.add(rootNode);
pathInfoMap.put(rootNode.getId(), rootNode);
deepNode(pathInfoList, pathInfoMap, "array".equals(rootNode.getType()) ? objectNode.get("items").get("properties") : objectNode.get("properties"), rootNode.getId());
System.out.println(JsonUtils.toJSONString(pathInfoMap));
Map<String, List<PathInfo>> map = pathInfoList.stream().collect(Collectors.groupingBy(PathInfo::getParentId));
pathInfoList.forEach(e -> e.setChild(map.getOrDefault(e.getId(), new ArrayList<>())));
System.out.println(JsonUtils.toJSONString(rootNode));
}
public static void deepNode(List<PathInfo> pathInfoList, Map<String, PathInfo> pathInfoMap, JsonNode jsonNode, String parentId) {
Iterator<Map.Entry<String, JsonNode>> iterator = jsonNode.fields();
while (iterator.hasNext()) {
Map.Entry<String, JsonNode> nodeEntry = iterator.next();
JsonNode node = nodeEntry.getValue();
String prop = nodeEntry.getKey();
System.out.println(nodeEntry);
PathInfo pathNode = new PathInfo(UUID.randomUUID().toString(), parentId, prop, pathInfoMap.get(parentId).getPath() + "." + prop, node.get("type").asText());
if ("array".equals(pathNode.getType())) {
pathNode.setPath(pathNode.getPath() + "[]");
}
pathInfoList.add(pathNode);
pathInfoMap.put(pathNode.getId(), pathNode);
if (pathNode.getType().equals("object")) {
deepNode(pathInfoList, pathInfoMap, node.get("properties"), pathNode.getId());
}
if (pathNode.getType().equals("array")) {
deepNode(pathInfoList, pathInfoMap, node.get("items").get("properties"), pathNode.getId());
}
}
}
@Data
public static class PathInfo {
private String id;
private String parentId;
private String propName;
private String path;
private String alias;
private String type;
private List<PathInfo> child;
public PathInfo() {
}
public PathInfo(String id, String parentId, String propName, String path, String type) {
this.id = id;
this.parentId = parentId;
this.propName = propName;
this.path = path;
this.type = type;
}
}
@Data
public static class Stu {
private String name;
private Long id;
public Stu(String name) {
this.name = name;
}
public Stu(String name, Long id) {
this.name = name;
this.id = id;
}
public Stu() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
执行结果
直接上测试代码 依赖
<dependency>
<groupId>com.github.saasquatch</groupId>
<artifactId>json-schema-inferrer</artifactId>
<version>0.1.4</version>
</dependency>
有问题请指正