【问题标题】:Map java-object with all subclasses to json string将具有所有子类的 java-object 映射到 json 字符串
【发布时间】:2012-11-20 19:14:35
【问题描述】:

我知道如何序列化 java 对象。但是如果我有一个对象并且在另一个对象内部是空的呢?

例如

我的第一堂课:

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对象:

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

我不允许更改我的 POJO。 什么样的框架可以为我做到这一点?我尝试了 gson,但 gson 不适用于子类。

问候,戴夫

【问题讨论】:

    标签: java javascript json object serialization


    【解决方案1】:

    我搞定了!使用 Java 反射,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()返回字段的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() 调用用户定义的对象设置方法和子类的方法!是的。所以我的 Invoice 对象我会放在这里作为参数:

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

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 2020-10-09
      • 2021-11-17
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多