在项目当中经常会使用到json格式的数据和具体javabean类之间的转换,于是就动手写了下json转换的工具类,json数据和javabean类的转换主要的就是两个功能,一是将具体javabean转换成json格式的数据,二是将json格式的数据转换成相应的javabean。此工具类当中主要使用的是Gson来进行处理,这样会简化我们的转换功能。转换成json数据的代码如下(这个方法基本上已经包含了所有的GsonBuilder所需要的参数了,以后如果有不需要的参数,直接将其设置为null或false):
/** * 将给定的目标对象根据指定的条件参数转换成 {@code JSON} 格式的字符串。 * <p /> * <strong>该方法转换发生错误时,不会抛出任何异常。若发生错误时,曾通对象返回 <code>"{}"</code>; 集合或数组对象返回 * <code>"[]"</code></strong> * * @param target 目标对象。 * @param targetType 目标对象的类型。 * @param isSerializeNulls 是否序列化 {@code null} 值字段。 * @param version 字段的版本号注解。 * @param datePattern 日期字段的格式化模式。 * @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。 * @return 目标对象的 {@code JSON} 格式的字符串。 */ @SuppressWarnings("unchecked") public static String toJson(Object target, Type targetType, boolean isSerializeNulls, Double version, String datePattern, boolean excludesFieldsWithoutExpose) { if (target == null) return EMPTY_JSON; GsonBuilder builder = new GsonBuilder(); if (isSerializeNulls) builder.serializeNulls(); if (version != null) builder.setVersion(version.doubleValue()); if (!StringUtils.hasText(datePattern)) datePattern = DEFAULT_DATE_PATTERN; builder.setDateFormat(datePattern); if (excludesFieldsWithoutExpose) builder.excludeFieldsWithoutExposeAnnotation(); String result = EMPTY; Gson gson = builder.create(); try { if (targetType != null) { result = gson.toJson(target, targetType); } else { result = gson.toJson(target); } } catch (Exception ex) { log.warn("目标对象 " + target.getClass().getName() + " 转换 JSON 字符串时,发生异常!", ex); if (target instanceof Collection || target instanceof Iterator || target instanceof Enumeration || target.getClass().isArray()) { result = EMPTY_JSON_ARRAY; } else result = EMPTY_JSON; } return result; }转换成javabean代码如下: /** * 将给定的 {@code JSON} 字符串转换成指定的类型对象。 * * @param <T> 要转换的目标类型。 * @param json 给定的 {@code JSON} 字符串。 * @param token {@code com.google.gson.reflect.TypeToken} 的类型指示类对象。 * @param datePattern 日期格式模式。 * @return 给定的 {@code JSON} 字符串表示的指定的类型对象。 */ @SuppressWarnings("unchecked") public static <T> T fromJson(String json, TypeToken<T> token, String datePattern) { if (!StringUtils.hasText(json)) { return null; } GsonBuilder builder = new GsonBuilder(); if (!StringUtils.hasText(datePattern)) { datePattern = DEFAULT_DATE_PATTERN; } Gson gson = builder.create(); try { return (T) gson.fromJson(json, token.getType()); } catch (Exception ex) { log.error(json + " 无法转换为 " + token.getRawType().getName() + " 对象!", ex); return null; } }当我们在具体转换时不是使用TypeToken来指定将要转换的类型,而是直接指定转换成某个类的对象。这时我们可以使用如下代码: /** * 将给定的 {@code JSON} 字符串转换成指定的类型对象。<strong>此方法通常用来转换普通的 {@code JavaBean} 对象。</strong> * * @param <T> 要转换的目标类型。 * @param json 给定的 {@code JSON} 字符串。 * @param clazz 要转换的目标类。 * @param datePattern 日期格式模式。 * @return 给定的 {@code JSON} 字符串表示的指定的类型对象。 */ public static <T> T fromJson(String json, Class<T> clazz, String datePattern) { if (!StringUtils.hasText(json)) { return null; } GsonBuilder builder = new GsonBuilder(); if (!StringUtils.hasText(datePattern)) { datePattern = DEFAULT_DATE_PATTERN; } Gson gson = builder.create(); try { return gson.fromJson(json, clazz); } catch (Exception ex) { log.error(json + " 无法转换为 " + clazz.getName() + " 对象!", ex); return null; } }这里我只是列出了具体转换的代码,我们可能还会遇到不会有这么多参数的转换情况,这时我们可以根据要求对参数进行删减。
总结:一开始我写的时候没有想得这么全面,只是简单的实现了转换功能,连异常的catch信息都没有,后来觉得工具类是经常要使用的,异常信息如果不清楚的话以后在代码中报错了就很难找到出错的源头了,这样就把catch信息写得更加的清晰了,如果遇到报错我们就可以一下子看到是哪里出错,是什么导致出错。以后还是要多写点这样的工具类。