`
songchuanlu
  • 浏览: 32270 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于Gson的Json工具类

阅读更多

依赖commons-lang.jar,gson.jar

 

import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.lang.StringUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
 * 包含操作 {@code JSON} 数据的常用方法的工具类。
 */
public class JsonUtils {

    /** The Constant log. */
    private static final Log log = LogFactory.getLog(JsonUtils.class);

    /** 空的 {@code JSON} 数据 - <code>&quot;{}&quot;</code>。 */
    public static final String EMPTY_JSON = "{}";

    /** 空的 {@code JSON} 数组(集合)数据 - {@code "[]"}。 */
    public static final String EMPTY_JSON_ARRAY = "[]";

    /** 默认的 {@code JSON} 日期/时间字段的格式化模式。 */
    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 将给定的目标对象根据指定的条件参数转换成 {@code JSON} 格式的字符串。
     * <p />
     * <strong>该方法转换发生错误时,不会抛出任何异常。若发生错误时,曾通对象返回 <code>&quot;{}&quot;</code>;
     * 集合或数组对象返回 <code>&quot;[]&quot;</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.isEmpty(datePattern))
            datePattern = DEFAULT_DATE_PATTERN;
        builder.setDateFormat(datePattern);
        if (excludesFieldsWithoutExpose)
            builder.excludeFieldsWithoutExposeAnnotation();

        String result = "";
        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;
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean} 对象。</strong>
     * <ul>
     * <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target) {
        return toJson(target, null, false, null, null, true);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean} 对象。</strong>
     * <ul>
     * <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param datePattern 日期字段的格式化模式。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, String datePattern) {
        return toJson(target, null, false, null, datePattern, true);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean} 对象。</strong>
     * <ul>
     * <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param version 字段的版本号注解({@literal @Since})。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Double version) {
        return toJson(target, null, false, version, null, true);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean} 对象。</strong>
     * <ul>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, boolean excludesFieldsWithoutExpose) {
        return toJson(target, null, false, null, null, excludesFieldsWithoutExpose);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法只用来转换普通的 {@code JavaBean} 对象。</strong>
     * <ul>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param version 字段的版本号注解({@literal @Since})。
     * @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Double version, boolean excludesFieldsWithoutExpose) {
        return toJson(target, null, false, version, null, excludesFieldsWithoutExpose);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
     * <ul>
     * <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param targetType 目标对象的类型。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Type targetType) {
        return toJson(target, targetType, false, null, null, true);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
     * <ul>
     * <li>该方法只会转换标有 {@literal @Expose} 注解的字段;</li>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param targetType 目标对象的类型。
     * @param version 字段的版本号注解({@literal @Since})。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Type targetType, Double version) {
        return toJson(target, targetType, false, version, null, true);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
     * <ul>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法会转换所有未标注或已标注 {@literal @Since} 的字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param targetType 目标对象的类型。
     * @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Type targetType, boolean excludesFieldsWithoutExpose) {
        return toJson(target, targetType, false, null, null, excludesFieldsWithoutExpose);
    }

    /**
     * 将给定的目标对象转换成 {@code JSON} 格式的字符串。<strong>此方法通常用来转换使用泛型的对象。</strong>
     * <ul>
     * <li>该方法不会转换 {@code null} 值字段;</li>
     * <li>该方法转换时使用默认的 日期/时间 格式化模式 - {@code yyyy-MM-dd HH:mm:ss SSS};</li>
     * </ul>
     * 
     * @param target 要转换成 {@code JSON} 的目标对象。
     * @param targetType 目标对象的类型。
     * @param version 字段的版本号注解({@literal @Since})。
     * @param excludesFieldsWithoutExpose 是否排除未标注 {@literal @Expose} 注解的字段。
     * @return 目标对象的 {@code JSON} 格式的字符串。
     */
    public static String toJson(Object target, Type targetType, Double version,
            boolean excludesFieldsWithoutExpose) {
        return toJson(target, targetType, false, version, null, excludesFieldsWithoutExpose);
    }

    /**
     * 将给定的 {@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, boolean excludesFieldsWithoutExpose) {
        if (StringUtils.isEmpty(json)) {
            return null;
        }
        GsonBuilder builder = new GsonBuilder();
        
        if (StringUtils.isEmpty(datePattern)) {
            datePattern = DEFAULT_DATE_PATTERN;
        }
        builder.setDateFormat(datePattern);
        if(excludesFieldsWithoutExpose){
            builder.excludeFieldsWithoutExposeAnnotation();
        }
        Gson gson = builder.create();
        try {
            return (T)gson.fromJson(json, token.getType());
        } catch (Exception ex) {
            log.error(json + " 无法转换为 " + token.getRawType().getName() + " 对象!", ex);
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * 将给定的 {@code JSON} 字符串转换成指定的类型对象。
     * 
     * @param <T> 要转换的目标类型。
     * @param json 给定的 {@code JSON} 字符串。
     * @param token {@code com.google.gson.reflect.TypeToken} 的类型指示类对象。
     * @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
     */
    public static <T> T fromJson(String json, TypeToken<T> token) {
        return fromJson(json, token, null, true);
    }
    
    public static <T> T fromJson(String json, TypeToken<T> token, boolean excludesFieldsWithoutExpose) {
        return fromJson(json, token, null, excludesFieldsWithoutExpose);
    }
    /**
     * 将给定的 {@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.isEmpty(json)) {
            return null;
        }
        GsonBuilder builder = new GsonBuilder();
        if (StringUtils.isEmpty(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;
        }
    }

    /**
     * 将给定的 {@code JSON} 字符串转换成指定的类型对象。<strong>此方法通常用来转换普通的 {@code JavaBean}
     * 对象。</strong>
     * 
     * @param <T> 要转换的目标类型。
     * @param json 给定的 {@code JSON} 字符串。
     * @param clazz 要转换的目标类。
     * @return 给定的 {@code JSON} 字符串表示的指定的类型对象。
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return fromJson(json, clazz, null);
    }
}

 

分享到:
评论

相关推荐

    基于googleGson的Json工具类

    基于googleGson的Json工具类,支持List,Object与Json互转,简单易用,Java与Android通用

    Gson工具类JsonUtils

    JsonUtils是一个基于Gson的工具类,它扩展了Gson的功能,提供了一种更便捷的方式来转换Java对象到JSON字符串,以及从JSON字符串反序列化回Java对象。这个工具类还支持泛型和任意类型的转换,极大地简化了开发过程。 ...

    基于Gson的解析工具类

    基于Gson的解析工具类。有解析成对象或集合等多个方法。

    Gson包工具类

    Gson包工具类是Google开发的一个Java库,用于在Java对象和JSON数据之间进行映射。这个库使得在Java应用程序中处理JSON变得极其便捷,无论是在Android开发还是普通的Java项目中,Gson都是一个非常实用的工具。JSON...

    gson解析工具类封装

    本文将深入探讨如何封装一个Gson解析工具类,以优雅地处理JSON数据,尤其是避免在解析过程中遇到`String`为`null`时产生的错误。 首先,我们需要引入Gson库。如果你的项目是Maven项目,可以在pom.xml文件中添加以下...

    Gson+Json的jar包

    标题中的"Gson+Json的jar包"涉及到两个关键的Java库:Gson和Json。这两个库都是用于处理JSON(JavaScript Object Notation)数据的,JSON是一种轻量级的数据交换格式,广泛应用于网络通信和数据存储。 Gson是Google...

    利用Google Gson实现JSON字符串和对象之间相互转换

    Google Gson库提供了一个强大的工具,使得Java对象与JSON字符串之间的转换变得简单易行。本文将详细介绍如何利用Google Gson库进行JSON字符串与对象之间的相互转换。 首先,我们需要了解Gson的核心概念。Gson库通过...

    gson解析工具类

    这个"**gson解析工具类**"很可能是为了简化Gson库的使用,提供了一些便利的方法来处理JSON序列化和反序列化操作。下面我们将深入探讨Gson库以及如何利用工具类进行有效操作。 ### Gson库介绍 Gson库的核心功能在于...

    通过Gson解析Json文件

    在Java开发中,处理JSON数据是一项常见的任务,Gson库是由Google提供的一个强大的工具,用于在Java对象和JSON数据之间进行映射。本篇文章将详细阐述如何使用Gson库解析JSON文件,帮助开发者理解并掌握这一技能。 ...

    Android Studio下使用Google Gson解析Json数据示例

    Google Gson库是Java平台上的一个强大工具,用于将Java对象转换为对应的JSON表示,反之亦然。在Android Studio中,Gson库可以帮助我们方便地解析和生成JSON数据。本篇文章将详细介绍如何在Android Studio环境下使用...

    Gson工具类

    ### Gson工具类:实现JSON与Java对象的相互转换 Gson是Google提供的一个用于将Java对象转换为JSON字符串,以及将JSON字符串转换回Java对象的强大库。本文将深入解析Gson的基本用法,并通过示例代码来理解如何自定义...

    Gson解析(List和Map)格式json数据 - CSDN博客1

    总结来说,Gson是Java开发中处理JSON数据的强大工具,无论是List还是Map格式的JSON,都能轻松地转换为相应的Java对象,便于进一步的数据操作和处理。了解并熟练掌握Gson的使用,对于提升Java开发效率具有显著的帮助...

    Gson解析JSON数据的入门级源码

    在Java开发中,Gson库是一个非常常用的工具,它由Google提供,用于将Java对象转换为JSON字符串,以及将JSON字符串反序列化回相应的Java对象。这个“Gson解析JSON数据的入门级源码”应该包含了一些基础示例,帮助初学...

    Gson工具类 JsonUtil

    Google json工具类,将java对象装换为json,支持泛型和任意类型

    GSON工具测试类_java

    在Java开发中,Gson库是一个非常常用的工具,它由Google提供,用于在Java对象和JSON数据之间进行互相转换。Gson库的强大之处在于它的灵活性和便捷性,使得处理JSON格式的数据变得简单易行。本测试类将深入探讨如何...

    Gson处理Json格式字符串代码

    在Java开发中,Gson库是Google...总之,Gson库为Java开发者提供了强大且易用的工具,简化了JSON数据和Java对象之间的转换。不论是在服务器端处理HTTP请求响应,还是在客户端存储用户数据,Gson都是一个值得信赖的选择。

    assets下使用gson进行json文件读取

    这段代码定义了一个名为`JsonUtils`的工具类,其中包含两个静态方法:`readJsonFromAssets`用于读取`assets`目录下的JSON文件,返回JSON字符串;`jsonToObject`则利用`Gson`将JSON字符串转换为指定的Java对象。 ...

    gsonUtil gson工具类。

    gsonUtil gson工具类。 已实现 1.json 转对象 2.json 转list 对象 3. 对象转json 等

    gson和json

    这一特性使得Gson成为在Java应用中处理JSON数据的理想工具,尤其在服务器端和Android开发中。 使用Gson库的基本步骤如下: 1. **序列化(对象转JSON)**:将Java对象转换为JSON字符串。你可以通过`Gson`类的`to...

Global site tag (gtag.js) - Google Analytics