1

I want to generate a JSON array(configuration) with respect to Configuration class fields. What I want to do is If some field is true, then add its custom predefined value to JSON array.

How can I create a JSON array with these values?

public class Configuration{
    private Boolean width;
    private Boolean height;
    private Boolean isValid;

    //Getters and setters
}

for example if all fields are true I want to generate a JSON array like;

String configuration = "['valid', {'height' : 768}, {'width' : 1024}, {'align': []}]";

if only isValid and height are true;

String configuration = "['valid', {'height' : 768}]";

What did I do so far;

String configuration = "["; 

if(width){
    configuration += "{'width' : 1024}, ";
}

if(height){
    configuration += "{'height' : 768}, ";
}

if(align){
    configuration += "{'align' : []}, ";
}

....//After 40 fields

configuration += "]";
hellzone
  • 5,393
  • 25
  • 82
  • 148
  • @BERNARDO Problem is creating an array. Configuration class got nearly 30 fields and I don't want to write 30 times IF condition. – hellzone Feb 06 '18 at 13:08
  • It has to be array? Can't be a regular object? –  Feb 06 '18 at 13:10
  • @EugenCovaci Yes it has to be an array. – hellzone Feb 06 '18 at 13:13
  • if you are sick, you can try to use same named labels and try to do something like @depreceated `for (condition : conditions) configuration += Config[retrieveFieldName(condition)]` – gkhaos Feb 06 '18 at 13:22
  • I don't know how to avoid using the `if` conditions in your specific case, but `JsonArray` can surely be used to avoid the formatting of string. https://docs.oracle.com/javaee/7/api/javax/json/JsonArray.html. Also have a look into how can you use it : https://stackoverflow.com/questions/18983185/how-to-create-correct-jsonarray-in-java-using-jsonobject – VPK Feb 06 '18 at 13:25

1 Answers1

1

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);
    }
}