示例#1
0
文件: Lang.java 项目: flymichael/nutz
  @SuppressWarnings("unchecked")
  private static <T extends Map<String, Object>> void obj2map(
      Object obj, T map, Map<Object, Object> memo) {
    if (null == obj || memo.containsKey(obj)) return;
    memo.put(obj, "");

    Mirror<?> mirror = Mirror.me(obj.getClass());
    Field[] flds = mirror.getFields();
    for (Field fld : flds) {
      Object v = mirror.getValue(obj, fld);
      if (null == v) {
        map.put(fld.getName(), null);
        continue;
      }
      Mirror<?> mr = Mirror.me(fld.getType());
      if (mr.isNumber()
          || mr.isBoolean()
          || mr.isChar()
          || mr.isStringLike()
          || mr.isEnum()
          || mr.isDateTimeLike()) {
        map.put(fld.getName(), v);
      } else if (memo.containsKey(v)) {
        map.put(fld.getName(), null);
      } else {
        T sub;
        try {
          sub = (T) map.getClass().newInstance();
        } catch (Exception e) {
          throw Lang.wrapThrow(e);
        }
        obj2map(v, sub, memo);
        map.put(fld.getName(), sub);
      }
    }
  }
示例#2
0
 public void render(Object obj) throws IOException {
   if (null == obj) {
     writer.write("null");
   } else if (obj instanceof JsonRender) {
     ((JsonRender) obj).render(null);
   } else if (obj instanceof Class) {
     string2Json(((Class<?>) obj).getName());
   } else if (obj instanceof Mirror) {
     string2Json(((Mirror<?>) obj).getType().getName());
   } else {
     Mirror mr = Mirror.me(obj.getClass());
     // 枚举
     if (mr.isEnum()) {
       string2Json(((Enum) obj).name());
     }
     // 数字,布尔等
     else if (mr.isNumber()) {
       String tmp = obj.toString();
       if (tmp.equals("NaN")) {
         // TODO 怎样才能应用上JsonFormat中是否忽略控制呢?
         // 因为此时已经写入了key:
         writer.write("null");
       } else writer.write(tmp);
     } else if (mr.isBoolean()) {
       writer.append(obj.toString());
     }
     // 字符串
     else if (mr.isStringLike() || mr.isChar()) {
       string2Json(obj.toString());
     }
     // 日期时间
     else if (mr.isDateTimeLike()) {
       boolean flag = true;
       if (obj instanceof Date) {
         DateFormat df = format.getDateFormat();
         if (df != null) {
           string2Json(df.format((Date) obj));
           flag = false;
         }
       }
       if (flag) string2Json(format.getCastors().castToString(obj));
     }
     // 其他
     else {
       // Map
       if (obj instanceof Map) {
         map2Json((Map) obj);
       }
       // 集合
       else if (obj instanceof Collection) {
         coll2Json((Collection) obj);
       }
       // 数组
       else if (obj.getClass().isArray()) {
         array2Json(obj);
       }
       // 普通 Java 对象
       else {
         memo.add(obj);
         pojo2Json(obj);
         memo.remove(obj);
       }
     }
   }
 }