【问题标题】:How to create a Json Array from class fields with custom values?如何从具有自定义值的类字段创建 Json 数组?
【发布时间】:2018-07-16 13:14:15
【问题描述】:

我想针对配置类字段生成一个 JSON 数组(配置)。我想做的是如果某个字段为真,则将其自定义预定义值添加到 JSON 数组。

如何使用这些值创建 JSON 数组?

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

    //Getters and setters
}

例如,如果所有字段都为真,我想生成一个 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 += "]";

【问题讨论】:

  • @BERNARDO 问题在于创建数组。配置类有近30个字段,不想写30次IF条件。
  • 必须是数组?不能是普通对象吗?
  • @EugenCovaci 是的,它必须是一个数组。
  • 如果你生病了,你可以尝试使用同名标签并尝试做类似@depreceated for (condition : conditions) configuration += Config[retrieveFieldName(condition)]
  • 我不知道如何避免在您的特定情况下使用if 条件,但JsonArray 肯定可以用于避免字符串的格式设置。 docs.oracle.com/javaee/7/api/javax/json/JsonArray.html。还可以看看如何使用它:stackoverflow.com/questions/18983185/…

标签: java json jackson


【解决方案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);
    }
}

【讨论】:

  • 我认为这是唯一的方法。感谢您的回答。
  • 对不起,我把你的昵称误读为“helizone”——因此是包名...Appologies... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多