2012-11-20 1 views
0

Я знаю, как сериализовать java-объекты. но что, если у меня есть объекты и внутри другого объекта, который является нулевым?Карта java-объекта со всеми подклассами json string

например.

Мой первый класс:

public class Invoice { 

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

} 

Мой второй класс:

public class Adresse { 

    private String name; 
    private Ort ort; 

} 

Мой третий класс:

public class Ort { 

    private String plz; 
    private String name; 

} 

А может быть, больше, сгенерированные подклассы ...

Я хочу получить этот json obj ect:

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

Мне не разрешено изменять POJO. Какие рамки могут сделать это для меня? Я пробовал gson, но gson не работает с подклассами.

привет, dave

ответ

0

У меня это работает! С Java Reflection, json и рекурсивным!

Вот код:

  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() ВЫЗОВ пользовательские методы объекта сеттер и те из подклассов! да. Так что мой счет-фактура объект, который я бы поставил здесь в качестве параметра:

    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"); 
      } 
      } 
     } 
Смежные вопросы