2012-11-20 32 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"); 
      } 
      } 
     }