In such cases I find it useful to write an annotation and use reflection.
Below is a simple example of this. You can also combine this with the JsonArray suggested by VPK.
JsonArrayMember.java -- the annotation we use
package org.stackoverflow.helizone.test;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonArrayMember {
public String value();
}
Configuration.java -- the Configuration class with its fields annotated with @JsonArrayMember
package org.stackoverflow.helizone.test;
public class Configuration {
@JsonArrayMember("{width: 1024}")
private Boolean width;
@JsonArrayMember("{height: 768}")
private Boolean height;
@JsonArrayMember("'valid'")
private Boolean isValid;
public Boolean getWidth() {
return width;
}
public void setWidth(Boolean width) {
this.width = width;
}
public Boolean getHeight() {
return height;
}
public void setHeight(Boolean height) {
this.height = height;
}
public Boolean getIsValid() {
return isValid;
}
public void setIsValid(Boolean isValid) {
this.isValid = isValid;
}
}
ConfigurationProcessor - the class to handle processing the configuration object and rendering the JSON
package org.stackoverflow.helizone.test;
import java.lang.reflect.Field;
public class ConfigurationProcessor {
public String toJson(Configuration configuration) {
StringBuilder sb = new StringBuilder();
sb.append("[");
Field[] fields = configuration.getClass().getDeclaredFields();
for (Field fld : fields) {
String fieldName = fld.getName();
JsonArrayMember fieldAnnotation = fld.getAnnotation(JsonArrayMember.class);
if (fieldAnnotation == null) {
// field not annotated with @JsonArrayMember, skip
System.out.println("Skipping property " + fieldName + " -- no @JsonArrayMember annotation");
continue;
}
if (!fld.getType().equals(Boolean.class)) {
// field is not of boolean type -- skip??
System.out.println("Skipping property " + fieldName + " -- not Boolean");
continue;
}
Boolean value = null;
try {
value = (Boolean) fld.get(configuration);
} catch (IllegalArgumentException | IllegalAccessException exception) {
// TODO Auto-generated catch block
exception.printStackTrace();
}
if (value == null) {
// the field value is null -- skip??
System.out.println("Skipping property " + fieldName + " -- value is null");
continue;
}
if (value.booleanValue()) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(fieldAnnotation.value());
} else {
System.out.println("Skipping property " + fieldName + " -- value is FALSE");
}
}
return sb.toString();
}
}
Application.java - a sample test application
package org.stackoverflow.helizone.test;
public class Application {
public static void main(String[] args) {
Configuration configuration = new Configuration();
configuration.setHeight(true);
configuration.setWidth(true);
configuration.setIsValid(false);
ConfigurationProcessor cp = new ConfigurationProcessor();
String result = cp.toJson(configuration);
System.out.println(result);
}
}