2012-11-20 61 views
0

我知道如何序列化java對象。但是如果我有一個對象,而另一個對象是空的呢?將java-object與所有子類映射到json字符串

例如

我的第一類:

public class Invoice { 

    private Adresse adresse; 
    private Double betrag; 
    private Double ust; 
    private String zweck; 

} 

我的第二類:

public class Adresse { 

    private String name; 
    private Ort ort; 

} 

我的第3類:

public class Ort { 

    private String plz; 
    private String name; 

} 

也許更生成的子類...

我想要得到這個json obj等:

{"adresse":{"name":null,"ort"{"plz":null,"name":null}},"betrag":null,"Ust":null,"zweck":null} 

我不能改變我的POJO的。 什麼樣的框架可以爲我做這個?我試過gson,但是gson沒有使用子類。

問候,戴夫

回答

0

我明白了!使用Java反射,json和它是遞歸的!

這裏的代碼:

  1. 用戶自定義的()檢查是否一個類被用戶定義的或原始的,可以根據需要進行定製。

    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()調用用戶定義的對象setter方法和這些子類的!是啊。所以,我的發票對象我把這裏作爲一個參數:

    Invoice i = new Invoice(); 
    invokeSetters(i); 
    

在這裏它是:

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