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 += "]";
5
  • @BERNARDO Problem is creating an array. Configuration class got nearly 30 fields and I don't want to write 30 times IF condition. Commented Feb 6, 2018 at 13:08
  • It has to be array? Can't be a regular object? Commented Feb 6, 2018 at 13:10
  • @EugenCovaci Yes it has to be an array. Commented Feb 6, 2018 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)] Commented Feb 6, 2018 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. docs.oracle.com/javaee/7/api/javax/json/JsonArray.html. Also have a look into how can you use it : stackoverflow.com/questions/18983185/… Commented Feb 6, 2018 at 13:25

1 Answer 1

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);
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

I think this is the only way.Thanks for your answer.
Sorry, I misread your nickname as "helizone" - therefore the package name... Appologies... :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.