我知道如何序列化空对象。但是,如果我有一个对象并且在另一个为 null 的对象中怎么办?
例如
我的第一节课:
public class Invoice {
private Adresse adresse;
private Double betrag;
private Double Ust;
private String zweck;
}
我的第二节课:
public class Adresse {
private String name;
private Ort ort;
}
还有更多子类...
如果我这样做:
Gson gson = new GsonBuilder().serializeNulls().create();
我只得到这个:
{"adresse":null,"betrag":null,"Ust":null,"zweck":null}
而不是这个:
{"adresse":{"name":null,"ort"{"plz":null,"name":null}},"betrag":null,"Ust":null,"zweck":null}
应该有一个自动化的方法来处理它。总会有其他子类。因此,手动方法是行不通的。
最佳答案
我成功了!使用 Java 反射!
这里是代码:
userDefined() 检查一个类是用户定义的还是原始的,可以根据需要自定义。
public boolean isUserDefined(Class o) { if (o.isAssignableFrom(String.class)) { return false; } if (o.isAssignableFrom(Double.class)) { return false; } if (o.isAssignableFrom(Integer.class)) { return false; } if (o.isAssignableFrom(Boolean.class)) { return false; } if (o.isAssignableFrom(Short.class)) { return false; } if (o.isAssignableFrom(Float.class)) { return false; } if (o.isAssignableFrom(Long.class)) { return false; } return true; }
getSetterMethod() 返回字段的 setter 方法。
private static Method getSetterMethod(Object o, Field f) { for (Method method : o.getClass().getMethods()) { String fieldname = "set" + f.getName(); String methodname = method.getName().toLowerCase(); if (fieldname.equals(methodname)) { return method; } } return null; }
最后,invokeSetters() 调用用户定义的对象 setter 方法和子类的方法!是的。
private void invokeSetters(Object o) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException, InstantiationException, NoSuchMethodException, InvocationTargetException { System.out.println("INVOKING THE OBJECT " + o.getClass().toString()); for (Field f : o.getClass().getDeclaredFields()) { System.out.println("NOW IN THE FIELD: " + f.getName()); f.setAccessible(true); Object obj = null; if (isUserDefined(f.getType()) && f.get(o) == null) { System.out.println("FIELD is USER DEFINED AND NULL"); Class c = Class.forName(f.getType().getName()); System.out.println("CLASS IS " + c.getName()); obj = c.getConstructor().newInstance(); System.out.println("GOING INSIDE " + obj.toString() + " NOW."); invokeSetters(obj); } if (obj != null) { Method setter = getSetterMethod(o, f); System.out.println("IM IN PARENT OBJECT " + o + " AND INVOKING METHOD " + setter.getName() + " WITH PARAMETER " + obj.toString()); setter.invoke(o, obj); System.out.println("METHOD WAS INVOKED"); } } }
关于java - 使用 gson 序列化嵌套类 null 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447212/