我想生成一个关于Configuration类字段的JSON数组(配置)。我想要做的是如果某个字段为true,则将其自定义预定义值添加到JSON数组。
如何使用这些值创建JSON数组?
public class Configuration{
private Boolean width;
private Boolean height;
private Boolean isValid;
//Getters and setters
}
例如,如果所有字段都为true,我想生成一个JSON数组,如;
String configuration = "['valid', {'height' : 768}, {'width' : 1024}, {'align': []}]";
如果只有isValid和height为真;
String configuration = "['valid', {'height' : 768}]";
到目前为止我做了什么;
String configuration = "[";
if(width){
configuration += "{'width' : 1024}, ";
}
if(height){
configuration += "{'height' : 768}, ";
}
if(align){
configuration += "{'align' : []}, ";
}
....//After 40 fields
configuration += "]";
答案 0 :(得分:1)
在这种情况下,我发现编写注释并使用反射很有用。 以下是一个简单的例子。您也可以将它与VPK建议的JsonArray结合使用。
JsonArrayMember.java - 我们使用的注释
package org.stackoverflow.helizone.test;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonArrayMember {
public String value();
}
Configuration.java - Configuration类,其字段用@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 - 处理配置对象并呈现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 - 示例测试应用程序
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);
}
}