Json 数据解析之 Gson 解析

本贴最后更新于 3102 天前,其中的信息可能已经东海扬尘

Json类型数据可以通过Json官方提供的方法将Json字符串转化为对象类型,但是解析往往比较麻烦,

Gson是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来

谷歌提供的Gson解析Json往往比Json解析更出色,更简单

在这里我写四个通用方法,将最常用的四种数据类型通过Gson将json数据解析还原为对象类型,List包裹对象类型,List包裹字符串类型,List包裹map类型。

 

如果没有看我的Android客户端与服务器端交互数据之json解析,有些类的调用省略没有写,建议先看一下

Gson解析需要的jar包下载(免积分)

1.首先写Gson工具类,将Java对象转换为JSON数据,以及将JSON数据转换为Java对象

package com.zml.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

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

/**

  • @author 郑明亮

  • @Time:2016 年 2 月 2 日 下午 2:15:38

  • @version 1.0
    */
    public class GsonTools {

    /**TODO 转换为 json 字符串

    • @param src 要转换成 json 格式的 对象
    • @return
      */
      public static String createJsonString(Object src) {
      Gson gson = new Gson();
      String jsonString = gson.toJson(src);
      return jsonString;
      }

    /**TODO 转换为指定的 对象

    • @param jsonString
    • @param type 指定对象的类型 ,即 T.class
    • @return
      */
      public static <T> T getObject(String jsonString, Class<T> type) {
      T t = null;
      try {
      Gson gson = new Gson();
      t = gson.fromJson(jsonString, type);
      } catch (JsonSyntaxException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      return t;
      }

    /**得到 一个 List<T>集合

    • @param jsonString
    • @param type T 的类型
    • @return
      */
      public static <T> List<T> getList(String jsonString, Class<T> type) {
      List<T> list = new ArrayList<T>();
      Gson gson = new Gson();
      list = gson.fromJson(jsonString, new TypeToken<List<T>>() {
      }.getType());
      return list;

    }

    /**TODO 得到一个 List<T> 的集合

    • @param jsonString json 字符串

    • @param type 数组的类型 ,即 T[].class

    • @return
      */
      public static <T> List<T> StringTolist(String jsonString, Class<T[]> type) {
      T[] list = null;
      try {
      Gson gson = new Gson();
      list = gson.fromJson(jsonString, type);
      } catch (JsonSyntaxException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }

      return Arrays.asList(list);

    }
    /**把 json 字符串转换为 String 集合

    • @param jsonString
    • @return
      */
      public static List<String> getStrings(String jsonString) {
      List<String> list = new ArrayList<String>();
      Gson gson = new Gson();
      new TypeToken<List<String>>(){}.getType();
      list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
      }.getType());
      return list;

    }

    /**TODO 将 json 数据解析为 Map<String,Object>集合

    • @param jsonString

    • @return
      */
      public static List<Map<String, Object>> getMaps(String jsonString) {

      List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
      Gson gson = new Gson();
      list = gson.fromJson(jsonString,
      new TypeToken<List<Map<String, Object>>>() {
      }.getType());

      return list;

    }

}

2.开始测试

package com.zml.test;

import java.util.List;
import java.util.Map;

import com.zml.pojo.Person;
import com.zml.utils.DataUtil;
import com.zml.utils.GsonTools;
import com.zml.utils.JsonTools;


/**
 * @author 郑明亮
 * @Time:2016年2月3日 下午1:10:44
 * @version 1.0  
 */
public class testgson {

	public static void main(String[] args) {
			String jsonString;
			jsonString = GsonTools.createJsonString(DataUtil.getPerson());
			System.out.println("-------------------转化为Json字符串------------------");
			System.out.println(jsonString);			
			System.out.println("-------------------解析后------------------");
			Person person = GsonTools.getPerson(jsonString, Person.class);
			System.out.println(person.toString());
			
			System.out.println("-------------------转化为Json字符串------------------");
			jsonString = GsonTools.createJsonString(DataUtil.getPersons());
			System.out.println(jsonString);	
			System.out.println("-------------------解析后------------------");
			List<Person> list = GsonTools.getlist(jsonString, Person.class);
			System.out.println(list.toString());
			
			
			System.out.println("-------------------转化为Json字符串------------------");
			jsonString = GsonTools.createJsonString(DataUtil.getStrings());
			System.out.println(jsonString);		
			System.out.println("-------------------解析后------------------");
			List<String> list2 = GsonTools.getStrings(jsonString);
			System.out.println(list2.toString());
			
			
			System.out.println("-------------------转化为Json字符串------------------");
			jsonString = GsonTools.createJsonString(DataUtil.getMaps());
			System.out.println(jsonString);		
			System.out.println("-------------------解析后------------------");
			List<Map<String, Object>> list3 = GsonTools.getMaps(jsonString);
			System.out.println(list3.toString());
		}
		

}

 

测试截图

 

http://img.blog.csdn.net/20160203144339626

3.测试成功后,开始编写Servlet,测试

 

package com.zml.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zml.utils.DataUtil;
import com.zml.utils.GsonTools;
import com.zml.utils.JsonTools;

/**

  • @author 郑明亮

  • @Time:2016 年 2 月 3 日 下午 1:02:56

  • @version 1.0
    */
    public class GsonServlet extends HttpServlet {

    /**

    • Constructor of the object.
      */
      public GsonServlet() {
      super();
      }

    /**

    • Destruction of the servlet. <br>
      */
      public void destroy() {
      super.destroy(); // Just puts "destroy" string in log
      // Put your code here
      }

    /**

    • The doGet method of the servlet. <br>
    • This method is called when a form has its tag value method equals to get.
    • @param request the request send by the client to the server
    • @param response the response send by the server to the client
    • @throws ServletException if an error occurred
    • @throws IOException if an error occurred
      */
      public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    this.doPost(request, response);
    }

    /**

    • The doPost method of the servlet. <br>

    • This method is called when a form has its tag value method equals to post.

    • @param request the request send by the client to the server

    • @param response the response send by the server to the client

    • @throws ServletException if an error occurred

    • @throws IOException if an error occurred
      */
      public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      response.setContentType("text/html;charset=utf-8");
      PrintWriter out = response.getWriter();
      String jsonString="";
      String actionString = request.getParameter("action");

      if (actionString.equals("person")) {

      jsonString = GsonTools.createJsonString(DataUtil.getPerson());

      } else if (actionString.equals("persons")) {

      jsonString = GsonTools.createJsonString(DataUtil.getPersons());

      } else if (actionString.equals("strings")) {

      jsonString = GsonTools.createJsonString(DataUtil.getStrings());

      } else if (actionString.equals("maps")) {

      jsonString = GsonTools.createJsonString(DataUtil.getMaps());

      }
      System.out.println(jsonString);
      out.print(jsonString);
      out.flush();
      out.close();
      }

    /**

    • Initialization of the servlet. <br>
    • @throws ServletException if an error occurs
      */
      public void init() throws ServletException {
      // Put your code here
      }

}

 

测试成功截图:

 

http://img.blog.csdn.net/20160203144831307

 

http://img.blog.csdn.net/20160203144840987

 

http://img.blog.csdn.net/20160203145308973

 

源码下载(免积分)

 

 

 

 

 

 

 

 

 

 

  • Gson
    2 引用
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 84 关注
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 104 关注
  • OnlyOffice
    4 引用 • 18 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • 电影

    这是一个不能说的秘密。

    123 引用 • 608 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 757 回帖 • 1 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 181 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 265 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 682 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 251 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 253 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 564 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 495 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 624 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    201 引用 • 1446 回帖 • 1 关注
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 280 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖