java - 使用 gson 序列化嵌套类 null 对象?

标签 java object null gson

我知道如何序列化空对象。但是,如果我有一个对象并且在另一个为 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 反射!

这里是代码:

  1. 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;
    }
    
  2. 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;
    }
    
  3. 最后,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/

相关文章:

java - 从数组中随机播放特定对象

mysql - 使用默认值 NULL 好吗?

c++ - 数组访问导致空指针取消引用

java - Spring如何从 Controller 返回 View 而不出现错误页面

java - 线程中的异常 "main"org.hibernate.AnnotationException : @OneToOne or @ManyToOne

JavaScript - 操作对象的嵌套多维数组

javascript - 在 JavaScript 中的自定义对象中使用原型(prototype)

Java JRE 混合代码安全性,从 JRE 1.6.0_19 开始

java - 使用 Java/JaCoB 让 32 位 COM 客户端与进程外 64 位服务器通信

java - 在调用它之前如何确保另一个线程的处理程序不为空?