I am extremely lazy, and I want to model JSON, or Java, but not both at the same time.
In case you want to write JSON first, and then generate Java:
https://github.com/astav/JsonToJava
git clone https://github.com/astav/JsonToJava.git
cd JsonToJava
mvn package
./sample-run.sh
java -cp target/classes/:lib/*:import/ com.astav.jsontojava.JsonToJava sample.json out test TestOutput regex-sample.json false
rules.json
I run this:
export CLASSPATH=target/classes/:lib/*:import/
java com.astav.jsontojava.JsonToJava rules.json out test TestOutput regex-sample.json false
this is what it generates:
RulesEntry.java
TestOutput.java
An alternative is http://www.jsonschema2pojo.org/ , for the same input JSON I get a somehow less accurate modelling:
To model Java first, then JSON:
and I get this
{"rules":[{"gav":"org.codehaus.plexus:plexus-utils:3.0","allow":true},{"gav":"org.codehaus.plexus:plexus-utils:2.6","allow":false}]}
Rules [rules=[Rule [gav=org.codehaus.plexus:plexus-utils:3.0, allow=true], Rule [gav=org.codehaus.plexus:plexus-utils:2.6, allow=false]]]
In case you want to write JSON first, and then generate Java:
https://github.com/astav/JsonToJava
git clone https://github.com/astav/JsonToJava.git
cd JsonToJava
mvn package
./sample-run.sh
java -cp target/classes/:lib/*:import/ com.astav.jsontojava.JsonToJava sample.json out test TestOutput regex-sample.json false
rules.json
{
"rules": [
{"gav":"org.codehaus.plexus:plexus-utils:3.0" , "allow":"false"},
{"gav":"org.codehaus.plexus:plexus-utils:2.8" , "allow":"true"}
]
}
I run this:
export CLASSPATH=target/classes/:lib/*:import/
java com.astav.jsontojava.JsonToJava rules.json out test TestOutput regex-sample.json false
this is what it generates:
RulesEntry.java
package test;
import org.codehaus.jackson.annotate.JsonProperty;
import java.util.*;
public class RulesEntry {
@JsonProperty("allow") private Boolean allow;
@JsonProperty("gav") private String gav;
}
TestOutput.java
package test;
import org.codehaus.jackson.annotate.JsonProperty;
import java.util.*;
public class TestOutput {
@JsonProperty("rules") private Listrules;
}
An alternative is http://www.jsonschema2pojo.org/ , for the same input JSON I get a somehow less accurate modelling:
-----------------------------------com.example.Rule.java-----------------------------------
package com.example;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"gav",
"allow"
})
public class Rule {
@JsonProperty("gav")
private String gav;
@JsonProperty("allow")
private String allow;
@JsonIgnore
private MapadditionalProperties = new HashMap ();
@JsonProperty("gav")
public String getGav() {
return gav;
}
@JsonProperty("gav")
public void setGav(String gav) {
this.gav = gav;
}
@JsonProperty("allow")
public String getAllow() {
return allow;
}
@JsonProperty("allow")
public void setAllow(String allow) {
this.allow = allow;
}
@JsonAnyGetter
public MapgetAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
-----------------------------------com.example.Rules.java-----------------------------------
package com.example;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"rules"
})
public class Rules {
@JsonProperty("rules")
private Listrules = null;
@JsonIgnore
private MapadditionalProperties = new HashMap ();
@JsonProperty("rules")
public ListgetRules() {
return rules;
}
@JsonProperty("rules")
public void setRules(Listrules) {
this.rules = rules;
}
@JsonAnyGetter
public MapgetAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
To model Java first, then JSON:
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
public class RulesTest {
@Test
public void listToJSON() throws Exception {
List<Rules> list = new ArrayList<Rules>();
list.add(new Rule("org.codehaus.plexus:plexus-utils:3.0", true));
list.add(new Rule("org.codehaus.plexus:plexus-utils:2.6", false));
Rules rules = new Rules(list);
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(out, rules );
final byte[] data = out.toByteArray();
System.out.println(new String(data));
Rules rules2 = mapper.readValue(data, Rules.class);
System.out.println(rules2);
}
}
public class Rule {
String gav;
Boolean allow;
public String getGav() {
return gav;
}
public void setGav(String gav) {
this.gav = gav;
}
public Boolean getAllow() {
return allow;
}
public void setAllow(Boolean allow) {
this.allow = allow;
}
@Override
public String toString() {
return "Rule [gav=" + gav + ", allow=" + allow + "]";
}
public Rule(String gav, Boolean allow) {
super();
this.gav = gav;
this.allow = allow;
}
public Rule() {
super();
}
}
import java.util.List;
public class Rules {
private List<Rule> rules;
public List<Rule> getRules() {
return rules;
}
public void setRules(List<Rule> rules) {
this.rules = rules;
}
public Rules(List<Rule> rules) {
super();
this.rules = rules;
}
public Rules() {
super();
}
@Override
public String toString() {
return "Rules [rules=" + rules + "]";
}
}
and I get this
{"rules":[{"gav":"org.codehaus.plexus:plexus-utils:3.0","allow":true},{"gav":"org.codehaus.plexus:plexus-utils:2.6","allow":false}]}
Rules [rules=[Rule [gav=org.codehaus.plexus:plexus-utils:3.0, allow=true], Rule [gav=org.codehaus.plexus:plexus-utils:2.6, allow=false]]]