Skip to content

Commit de8a704

Browse files
added POJO generation
1 parent fff9d04 commit de8a704

File tree

7 files changed

+95
-7
lines changed

7 files changed

+95
-7
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Created by .ignore support plugin (hsz.mobi)
22
.idea
33
target
4-
output-schema.json
4+
output-schema.json

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
[![codecov](https://codecov.io/gh/simplymequeeny/json-string-schema-generator/branch/master/graph/badge.svg)](https://codecov.io/gh/simplymequeeny/json-string-schema-generator)
33

44
# json-string-schema-generator
5-
Generates JSON Schema based from JSON data using JAVA
5+
Generates JSON Schema or POJO based from JSON data using JAVA
66

77
#### Motivation
88
I have been googling a lot to find a library in JAVA that would generate me a JSON Schema based on the JSON data I have. But most of the libraries I found need to have a JAVA class in order to generate a JSON schema. So I made a simple JSON Schema Generator based on JSON data. If there is a library that already exists please let me know (via posting an Issue here) and I will be happy to use it in the current project I am working on. Thanks!
@@ -69,9 +69,11 @@ public class GenerateSchema {
6969
}
7070
*/
7171

72+
// To generate JSON schema into a file
7273
JsonSchemaGenerator.outputAsFile("Schedule", "this is a test", json, "output-schema.json");
73-
// the above statement will generate the file on the directory
74-
// where code was executed
74+
75+
// To generate POJO(s)
76+
JsonSchemaGenerator.outputAsPOJO("Schedule", "this is a test", json, "com.example", "generated-sources");
7577
}
7678
}
7779
```
@@ -82,6 +84,7 @@ public class GenerateSchema {
8284
1. [Java 8](https://www.oracle.com/java/index.html)
8385
1. [Jackson Databind](https://github.com/FasterXML/jackson-databind)
8486
1. [JSON Schema Validator](https://github.com/everit-org/json-schema)
87+
1. [jsonschema2pojo](http://www.jsonschema2pojo.org/)
8588

8689
#### License
8790
This project is licensed under the MIT License - see the [LICENSE](/LICENSE) file for details

dependency-reduced-pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>org.simplymequeeny</groupId>
55
<artifactId>json-string-schema-generator</artifactId>
6-
<version>1.0.2-SNAPSHOT</version>
6+
<version>1.0.2</version>
77
<scm>
88
<connection>scm:git:git://github.com/simplymequeeny/json-string-schema-generator.git</connection>
99
<developerConnection>scm:git:[email protected]:simplymequeeny/json-string-schema-generator.git</developerConnection>
10+
<tag>json-string-schema-generator-1.0.2</tag>
1011
<url>https://github.com/simplymequeeny/json-string-schema-generator</url>
1112
</scm>
1213
<build>

json-string-schema-generator.iml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
1919
<orderEntry type="library" name="Maven: com.github.everit-org.json-schema:org.everit.json.schema:1.6.0" level="project" />
2020
<orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
21-
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
2221
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
2322
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
2423
<orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
@@ -28,7 +27,27 @@
2827
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
2928
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
3029
<orderEntry type="library" name="Maven: com.damnhandy:handy-uri-templates:2.1.6" level="project" />
31-
<orderEntry type="library" name="Maven: joda-time:joda-time:2.9.4" level="project" />
30+
<orderEntry type="library" name="Maven: org.jsonschema2pojo:jsonschema2pojo-core:0.4.37" level="project" />
31+
<orderEntry type="library" name="Maven: com.google.code.javaparser:javaparser:1.0.11" level="project" />
32+
<orderEntry type="library" name="Maven: com.google.android:android:4.1.1.4" level="project" />
33+
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.0.1" level="project" />
34+
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.0.1" level="project" />
35+
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.3" level="project" />
36+
<orderEntry type="library" name="Maven: org.khronos:opengl-api:gl1.1-android-2.1_r1" level="project" />
37+
<orderEntry type="library" name="Maven: xerces:xmlParserAPIs:2.6.2" level="project" />
38+
<orderEntry type="library" name="Maven: xpp3:xpp3:1.1.4c" level="project" />
39+
<orderEntry type="library" name="Maven: com.sun.codemodel:codemodel:2.6" level="project" />
40+
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.5" level="project" />
41+
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" />
42+
<orderEntry type="library" name="Maven: com.squareup.moshi:moshi:1.1.0" level="project" />
43+
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.6.0" level="project" />
44+
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
45+
<orderEntry type="library" name="Maven: javax.validation:validation-api:1.0.0.GA" level="project" />
46+
<orderEntry type="library" name="Maven: joda-time:joda-time:2.2" level="project" />
47+
<orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13" level="project" />
48+
<orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13" level="project" />
49+
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.2.1" level="project" />
50+
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:1.3.9" level="project" />
3251
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
3352
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
3453
</component>

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
<artifactId>org.everit.json.schema</artifactId>
3434
<version>1.6.0</version>
3535
</dependency>
36+
<dependency>
37+
<groupId>org.jsonschema2pojo</groupId>
38+
<artifactId>jsonschema2pojo-core</artifactId>
39+
<version>0.4.37</version>
40+
</dependency>
3641

3742
<dependency>
3843
<groupId>junit</groupId>

src/main/java/org/simplymequeeny/JsonSchemaGenerator.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import com.fasterxml.jackson.databind.JsonNode;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.databind.node.JsonNodeType;
6+
import com.sun.codemodel.JCodeModel;
67
import org.apache.commons.io.FileUtils;
78
import org.everit.json.schema.Schema;
89
import org.everit.json.schema.loader.SchemaLoader;
910
import org.json.JSONObject;
1011
import org.json.JSONTokener;
12+
import org.jsonschema2pojo.SchemaMapper;
1113

1214
import java.io.File;
1315
import java.io.IOException;
@@ -35,6 +37,22 @@ public static void outputAsFile(String title, String description,
3537
"utf8");
3638
}
3739

40+
public static void outputAsPOJO(String title, String description,
41+
String json, String packageName,
42+
String outputDirectory) throws IOException {
43+
String schema = JsonSchemaGenerator.outputAsString(title, title, json);
44+
LOGGER.info("Generating POJO(s) ...");
45+
46+
File fDirectory = new File(outputDirectory);
47+
if (!fDirectory.exists()) FileUtils.forceMkdir(fDirectory);
48+
49+
JCodeModel codeModel = new JCodeModel();
50+
SchemaMapper mapper = new SchemaMapper();
51+
mapper.generate(codeModel, title, packageName, schema);
52+
codeModel.build(fDirectory);
53+
LOGGER.info("DONE.");
54+
}
55+
3856
private static String outputAsString(String title, String description,
3957
String json, JsonNodeType type) throws IOException {
4058
JsonNode jsonNode = objectMapper.readTree(json);

src/test/java/org/simplymequeeny/JsonSchemaGeneratorTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import org.junit.Assert;
1010
import org.junit.Test;
1111

12+
import java.io.File;
13+
import java.io.IOException;
14+
1215
public class JsonSchemaGeneratorTest {
1316

1417
@Test
@@ -54,6 +57,45 @@ public void shouldWriteJsonSchemaToFile() throws Exception {
5457
Assert.assertTrue(FileUtils.getFile(filename).exists());
5558
}
5659

60+
@Test
61+
public void shouldGeneratePOJOs() throws IOException {
62+
String json = "{\"createdAt\":\"2017-07-19T16:31:26.843Z\"," +
63+
"\"sectors\":[{\"times\":[{\"intensity\":30,\"start\":{\"hour\":8,\"minute\":30}," +
64+
"\"end\":{\"hour\":17,\"minute\":0}},{\"intensity\":10,\"start\":{\"hour\":17,\"minute\":5}," +
65+
"\"end\":{\"hour\":23,\"minute\":55}}],\"id\":\"dbea21eb-57b5-44c9-a953-f61816fd5876\"}]," +
66+
"\"dayOfWeek\":\"0,6\",\"createdBy\":\"Admin\",\"name\":\"test weekend preset\"," +
67+
"\"client\":\"TestClient\",\"id\":\"83d6640a-6d80-487c-b92c-e4239e1ec6d5\"," +
68+
"\"state\":true, \"dateToday\": \"null\"}";
69+
70+
String directory = "generated-sources";
71+
JsonSchemaGenerator.outputAsPOJO("Schedule", "Test", json,
72+
"com.example", directory);
73+
Assert.assertTrue("POJO(s) not generated",
74+
FileUtils.getFile(directory).list().length > 0);
75+
FileUtils.forceDeleteOnExit(new File(directory));
76+
}
77+
78+
@Test
79+
public void shouldGeneratePOJOsIntoExistingDirectory() throws IOException {
80+
String json = "{\"createdAt\":\"2017-07-19T16:31:26.843Z\"," +
81+
"\"sectors\":[{\"times\":[{\"intensity\":30,\"start\":{\"hour\":8,\"minute\":30}," +
82+
"\"end\":{\"hour\":17,\"minute\":0}},{\"intensity\":10,\"start\":{\"hour\":17,\"minute\":5}," +
83+
"\"end\":{\"hour\":23,\"minute\":55}}],\"id\":\"dbea21eb-57b5-44c9-a953-f61816fd5876\"}]," +
84+
"\"dayOfWeek\":\"0,6\",\"createdBy\":\"Admin\",\"name\":\"test weekend preset\"," +
85+
"\"client\":\"TestClient\",\"id\":\"83d6640a-6d80-487c-b92c-e4239e1ec6d5\"," +
86+
"\"state\":true, \"dateToday\": \"null\"}";
87+
88+
String directory = "generated-src";
89+
File dir = new File(directory);
90+
FileUtils.forceMkdir(dir);
91+
92+
JsonSchemaGenerator.outputAsPOJO("Schedule", "Test", json,
93+
"com.example", directory);
94+
Assert.assertTrue("POJO(s) not generated",
95+
FileUtils.getFile(directory).list().length > 0);
96+
FileUtils.forceDeleteOnExit(dir);
97+
}
98+
5799
private boolean isValid(String json, String result) {
58100
boolean isValid = true;
59101

0 commit comments

Comments
 (0)