gpt4 book ai didi

java - 从 Java 中的嵌套空对象创建示例 JSON

转载 作者:行者123 更新时间:2023-11-30 02:09:31 25 4
gpt4 key购买 nike

我正在尝试创建一个实用程序来打印任何给定 POJO 的示例 JSON 结构。我一直在尝试 Jackson 和 Gson 打印给定对象的所有字段。我创建了以下三个对象作为示例。

public class Model {
private String val1;
private Child child;
//getters and setters
}

public class Child {
private String val2;
private ArrayList<SubChild> subChildren;
//getters and setters
}

public class SubChild {
private String val3;
//getters and setters
}

我想要一个示例序列化程序,即使子对象为空,也可以打印这些对象及其所有字段名称。以下是我的目标输出:

{
"val1" : "",
"child" : {
"val2" : "",
"subChildren" : [ {
"val3" : ""
} ]
}
}

这些是我尝试打印这些 pojo 及其输出的方法,但它们不太符合我的需求

jackson :

ObjectMapper map = new ObjectMapper().setSerializationInclusion(Include.ALWAYS);
Model testModel = new Model()
map.writerWithDefaultPrettyPrinter().writeValueAsString(testModel);

输出:

{
"val1" : null,
"child" : null
}

Gson:

Gson gson = builder.serializeNulls().setPrettyPrinting().create();
Model testModel = new Model();
gson.toJson(testModel);

输出:

{
"val1" : null,
"child" : null
}

有没有一种简单的方法可以实现我的目标,而无需填充所有子字段?我希望能够在通用类上使用此实用程序,但我不知道要调用哪些方法来用空值填充对象。

最佳答案

我不明白这怎么可能。如果您有一个 Long 作为字段怎么办? jackson 不知道在那里该做什么。 Jackson 和 Gson 的做法是正确的,他们打印了 null

可以做的是编写一个实用程序来手动设置字段。但是,您必须相应地处理不同的类型。这样的东西可以实现您所要求的,但仅限于 List:

public static void main(String args[]) throws IOException, IllegalAccessException {
ObjectMapper map = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.ALWAYS);
Model testModel = new Model();

instantiateFields(testModel);

String result = map.writerWithDefaultPrettyPrinter().writeValueAsString(testModel);
System.out.println(result);
}

private static void instantiateFields(Object o) throws IllegalAccessException {
Field[] fields = o.getClass().getDeclaredFields();

for (Field field : fields) {
field.setAccessible(true);

if (field.get(o) == null) {
Type type = field.getType();

try {
Class<?> clazz = (Class<?>) type;
Object instance = clazz.newInstance();

if (List.class.isAssignableFrom(clazz)) {
instantiateList(clazz, field, instance);
}

field.set(o, instance);
instantiateFields(instance);

} catch (ClassCastException | InstantiationException e) {
// Handle this or leave field null
}
}
}
}

private static void instantiateList(Class<?> clazz, Field field, Object instance) throws IllegalAccessException, InstantiationException {
ParameterizedType listType = (ParameterizedType) field.getGenericType();
Class<?> listClass = (Class<?>) listType.getActualTypeArguments()[0];

Object listTypeInstance = listClass.newInstance();

instantiateFields(listTypeInstance);

List<Object> list = (List<Object>) instance;
list.add(listTypeInstance);
}

产生以下输出:

{
"val1" : "",
"child" : [ {
"val2" : "",
"subChildren" : [ {
"val3" : ""
} ]
} ]
}

希望这有帮助。

关于java - 从 Java 中的嵌套空对象创建示例 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com