Json 数据解析之 Gson 解析

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

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 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 3 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 13 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    26 引用 • 264 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 512 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 531 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • JWT

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

    20 引用 • 15 回帖 • 26 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 448 关注
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • BookxNote

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

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

    1 引用 • 1 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 651 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 808 关注