使用正确的数据值自动创建新的 Java 对象

Creating a new Java object automatically with correct data values

我想知道 Java 中是否有自动从简单的 POJO 创建具有正确数据值的对象?

假设我有一个像这样的简单 POJO:

public class POJO {

    private int intVar;
    private boolean booleanVar;
    private String stringVar;

    public POJO(int intVar, boolean booleanVar, String stringVar) {
        this.intVar = intVar;
        this.booleanVar = booleanVar;
        this.stringVar = stringVar;     
    }

    //Geteru & Setteru...   
}

所以基本上我想知道我是否可以使用某种方法从这个 class 创建一个对象,或者可以读取变量及其类型并为它们分配任何值但该值对变量数据类型。例如 intVar 应该得到一个整数,而 stringVar 应该得到一个 String 等

这不一定是执行此操作的方法,我实际上想要实现的是我正在尝试自动创建我拥有的这些 POJO 的 JSON,但问题是我需要一些值对于 JSON。我已经使用 gson 创建了我的 POJO 的 JSON,但我不知道如何自动为变量分配 "correct" 值。它不必通过创建新对象来实现,我需要的只是获得一个 JSON,其中包含从任何 POJO 创建的变量值。

例如:

{
     intVar=1,
     booleanVar=true,
     stringVar="my string"
}

我问的原因是我可以从像这样的简单 POJO 自动创建一个具有正确变量值的新对象,然后我可以从中创建令人满意的 JSON,但是如果任何人都知道获取 JSON 值的替代解决方案,请随时提出建议 :)。

尝试对模型实现可序列化。 然后你可以更改 json 属性名称,如果你想用 @SeriliazedName("stringVar")

有个例子:

public class POJO implements Serializable{

@SerializedName("intVar")
private int intVar ;
@SerializedName("stringVar")
private String stringVar;

当您的 class 只有原语和字符串时(如您的示例),您可以使用默认构造函数。这些字段将使用相应数据类型的默认值进行初始化:

public class Pojo {
    int intVar;
    boolean booleanVar;
    String stringVar;
}

Pojo pojo = new Pojo();
// pojo.intVar is now 0
// pojo.booleanVar is now false
// pojo.string Var is now ""

我认为您需要尝试使用 jackson 或 GS​​ON 库。根据我的经验,杰克逊更好。

我无法写出 100% 的实施工作方式,因为根据我的经验,我从不做相同的事情。我总是将 JSON 格式的数据转换为已知的 class(我认为它是 spring 控制器中作为参数的映射对象)。不知道,为什么你需要映射抽象class,可能是错误的设计,可能不是。

使用 jackson 你将能够使用继承: http://www.baeldung.com/jackson-inheritance,但我从来没有尝试过

如果不能满足您的需求,您可以使用这个:

Class[] candidates = new Class[]{InheritedClass1.class, InheritedClass2.class, InheritedClass3.class};
ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{\"your\":\"json\"}";
AbstractClass instance = null;
for(Class clazz : candidates) {
    try{
        instance = mapper.readValue(jsonInString, clazz);
    } catch (Exception e){
    }
    if(instance !== null) {
        break;
    }
}
System.out.println(instance);