Java 使用gson序列化嵌套类空对象?
我知道如何序列化空对象。但是如果我有一个对象,并且在另一个对象中是空的呢 e、 g 我的第一节课:Java 使用gson序列化嵌套类空对象?,java,object,null,gson,Java,Object,Null,Gson,我知道如何序列化空对象。但是如果我有一个对象,并且在另一个对象中是空的呢 e、 g 我的第一节课: public class Invoice { private Adresse adresse; private Double betrag; private Double Ust; private String zweck; } 我的第二节课: public class Adresse { private String name; private Ort
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}
应该有一种自动化的方法。总会有其他的子类。因此,手动方法是不可行的。如果您希望
ADRESE
具有这些属性,则需要将ADRESE
实例化为:
public class Invoice implements Serializable{
private Adresse adresse = new Adresse();
private Double betrag;
private Double Ust;
private String zweck;
}
我让它工作了!使用Java反射 代码如下:
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;
}
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;
}
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");
}
}
}
不。那些是波乔的。他们必须保持这种状态。我不允许更改它们。@Delta458:然后使用setter方法,如果可用,例如
invoice.setAddresse(addresse)在序列化之前,通过传递new adrese()
进行编码。但是会生成大量的类和子类。我不能手工做那件事。也许是深思熟虑。。但那是一种痛苦lol@Delta458由于我对您的对象层次结构没有太多可见性,因此无法进行评论。您当前的问题是由于null
对象造成的<代码>如果对象本身为空,它将无法看到成员属性和子图。
类和子类将在运行时生成。。。所以这种方法是不现实的,除非我使用反射。。。也许和jackson一起玩java?