簡體   English   中英

用gson序列化嵌套類的空對象?

[英]Serialize nested class null objects with 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()返回字段的設置方法。

     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()調用用戶定義的對象設置方法和子類的方法! 是啊。

      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"); } } } 

如果希望adresse具有屬性,則需要實例化adresse為:

    public class Invoice implements Serializable{
        private Adresse adresse = new Adresse();
        private Double betrag;
        private Double Ust;
        private String zweck;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM