`
eksliang
  • 浏览: 598883 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Gson使用三(集合的处理,一对多处理)

阅读更多

转载请出自出处:http://eksliang.iteye.com/blog/2175532

一、概述

       Map保存的是键值对的形式,Json的格式也是键值对的,所以正常情况下,map跟json之间的转换应当是理所当然的事情。

二、Map参考实例

package com.ickes.json;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.ickes.json.daomain.User;
/**
 * Gson对Map的处理
 * @author Ickes
 *
 */
public class MapTest {
	public static void main(String[] args) {
		/**
		 * 普通map处理
		 */
		Map<String,String> map = new HashMap<String,String>();
		map.put("name","ickes");
		map.put("pwd", "123");
		Gson gson = new GsonBuilder()
		.enableComplexMapKeySerialization()
		.setPrettyPrinting()
		.setDateFormat("yyyy-MM-dd HH:mm:ss")
		.create();
		//map的序列化
		String json=gson.toJson(map);
		System.out.println("map的序列化:\n"+json);
		//map的反序列化
		Type typeMap = new TypeToken<Map<String,String>>(){}.getType();
		map = gson.fromJson(json,typeMap);
		System.out.println("map的反序列化:");
		for (Map.Entry<String,String> entry: map.entrySet()) {
			System.out.println(entry.getKey()+"-"+entry.getValue());
		}
		
		/**
		 * /map对象测试
		 */
		Map<String,User> mapUser = new HashMap<String,User>();
		User user1 = new User("A001", "xl","xl_123",24,12000F,new Date());
		User user2 = new User("A002", "x2","xl_223",24,13000F,new Date());
		mapUser.put("user1",user1);
		mapUser.put("user2",user2);
		json = gson.toJson(mapUser);
		System.out.println("Map对象的序列化:\n"+json);
		//map对象的反序列化
		Type typeUser = new TypeToken<Map<String,User>>(){}.getType();
		mapUser = gson.fromJson(json, typeUser);
		System.out.println("map对象的反序列化:");
		for (Map.Entry<String,User> entry: mapUser.entrySet()) {
			System.out.println(entry.getKey()+"-"+entry.getValue());
		}
		
		/**
		 * 整合测试
		 */
		Map<String,List<User>> mapList = new HashMap<String,List<User>>();
		List<User> users = new ArrayList<User>();
		users.add(user1);
		users.add(user2);
		mapList.put("mapList",users);
		//序列化
		json = gson.toJson(mapList);
		System.out.println("mapList的序列化:\n"+json);
		//反序列化
		Type typeMapList = new TypeToken<Map<String,List<User>>>(){}.getType();
		mapList = gson.fromJson(json, typeMapList);
		System.out.println("mapList对象的反序列化:");
		for (Map.Entry<String,List<User>> entry: mapList.entrySet()) {
			System.out.println(entry.getKey()+"-"+entry.getValue());
		}
	}
}

 返回结果:

map的序列化:
{
  "pwd": "123",
  "name": "ickes"
}
map的反序列化:
pwd-123
name-ickes
Map对象的序列化:
{
  "user2": {
    "id": "A002",
    "userName": "x2",
    "userPwd": "xl_223",
    "age": 24,
    "price": 13000.0,
    "birthday": "2015-01-13 16:06:48"
  },
  "user1": {
    "id": "A001",
    "userName": "xl",
    "userPwd": "xl_123",
    "age": 24,
    "price": 12000.0,
    "birthday": "2015-01-13 16:06:48"
  }
}
map对象的反序列化:
user2-User [id=A002, userName=x2, userPwd=xl_223, age=24, price=13000.0, birthday=Tue Jan 13 16:06:48 CST 2015]
user1-User [id=A001, userName=xl, userPwd=xl_123, age=24, price=12000.0, birthday=Tue Jan 13 16:06:48 CST 2015]
mapList的序列化:
{
  "mapList": [
    {
      "id": "A001",
      "userName": "xl",
      "userPwd": "xl_123",
      "age": 24,
      "price": 12000.0,
      "birthday": "2015-01-13 16:06:48"
    },
    {
      "id": "A002",
      "userName": "x2",
      "userPwd": "xl_223",
      "age": 24,
      "price": 13000.0,
      "birthday": "2015-01-13 16:06:48"
    }
  ]
}
mapList对象的反序列化:
mapList-[User [id=A001, userName=xl, userPwd=xl_123, age=24, price=12000.0, birthday=Tue Jan 13 16:06:48 CST 2015], User [id=A002, userName=x2, userPwd=xl_223, age=24, price=13000.0, birthday=Tue Jan 13 16:06:48 CST 2015]]

         温馨提示:Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址,通过调用GsonBuilder的enableComplexMapKeySerialization()来启用对Map键(key)的序列化.

 

 

 

三、一对多参考实例

下面实例提供了User(员工)对Dept(部门)一对多的映射关系

User实体类:

package com.ickes.json.daomain;

import java.util.Date;

/**
 * @author Ickes
 */
public class User {
	private String userName;
	private String userPwd;
	private Integer age;
	private Date    birthday;
	
	public User(String userName, String userPwd, Integer age, Date birthday) {
		super();
		this.userName = userName;
		this.userPwd = userPwd;
		this.age = age;
		this.birthday = birthday;
	}
	get()和set()方法省略.....!
	@Override
	public String toString() {
		return "User [userName=" + userName + ", userPwd=" + userPwd + ", age="
				+ age + ", birthday=" + birthday + "]";
	}
	
}

    Dept实体类:

   

package com.ickes.json.daomain;

import java.util.List;

public class Dept {
	private String id;
	private String deptName;
	private List<User> users;
	
	public Dept(String id, String deptName) {
		super();
		this.id = id;
		this.deptName = deptName;
	}
	get()和set()方法省略......!
	@Override
	public String toString() {
		return "Dept [id=" + id + ", deptName=" + deptName + ", users=" + users
				+ "]";
	} 
	
	
}

    测试实体类:

   

package com.ickes.json.daomain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
 * Gson处理这种一对多的序列化
 * @author Ickes
 *
 */
public class DeptTest {
	public static void main(String[] args) {
		User user1 = new User("xl","xl_223",12100,new Date());
		User user2 = new User("x2","xl_323",12300,new Date());
		User user3 = new User("x3","xl_423",12300,new Date());
		Dept dept = new Dept("D001","技术预研部");
		List<User> users = new ArrayList<User>();
		users.add(user1);
		users.add(user2);
		users.add(user3);
		dept.setUsers(users);
		
		Gson gson = new GsonBuilder()
		.setPrettyPrinting()
		.setDateFormat("yyyy-MM-dd HH:mm:ss")
		.create();
		String json=gson.toJson(dept);
		System.out.println("一对多的序列化:\n"+json);
		
		dept = gson.fromJson(json,Dept.class);
		System.out.println("一对多的反序列化:\n"+dept);
		
	}
}

   返回结果如下:

一对多的序列化:
{
  "id": "D001",
  "deptName": "技术预研部",
  "users": [
    {
      "userName": "xl",
      "userPwd": "xl_223",
      "age": 12100,
      "birthday": "2015-01-13 18:57:23"
    },
    {
      "userName": "x2",
      "userPwd": "xl_323",
      "age": 12300,
      "birthday": "2015-01-13 18:57:23"
    },
    {
      "userName": "x3",
      "userPwd": "xl_423",
      "age": 12300,
      "birthday": "2015-01-13 18:57:23"
    }
  ]
}
一对多的反序列化:
Dept [id=D001, deptName=技术预研部, 
users=[User [userName=xl, userPwd=xl_223, age=12100, birthday=Tue Jan 13 18:57:23 CST 2015], 
       User [userName=x2, userPwd=xl_323, age=12300, birthday=Tue Jan 13 18:57:23 CST 2015],
       User [userName=x3, userPwd=xl_423, age=12300, birthday=Tue Jan 13 18:57:23 CST 2015]
       ]]

 

 四、带泛型的list集合处理

 

public static void main(String[] args) {
		Gson gson = new Gson();
		String json="[{'last':'xiao','next':'ming'},{'last':'xiao','next':'liang'}]";
		List<Dept> list= null;
		list = gson.fromJson(json,new TypeToken<List<Dept>>(){}.getType());
		for (Dept dept : list) {
			System.out.println(dept);
		}
	}

 返回结果如下:

Dept [last=xiao, next=ming]
Dept [last=xiao, next=liang]

 

 

 

分享到:
评论

相关推荐

    Gson-2.7.jar

    4. **复杂类型的处理**:Gson能够处理各种复杂的Java类型,如集合、数组、枚举等。例如,解析一个包含多个`Person`对象的JSON数组: ```java Type listType = new TypeToken&lt;List&lt;Person&gt;&gt;(){}.getType(); List...

    gson2.7.jar

    6. **日期和时间处理**:Gson内置了对日期和时间的处理,可以方便地将日期对象转换为不同的格式。 7. **延迟解析**:通过`JsonParser`类,Gson允许逐步解析大型JSON文档,只加载当前需要的部分,以节省资源。 8. *...

    gson-2.3.jar

    `gson-2.3.jar`是Gson库的一个版本,发布于2014年,是许多Java项目中广泛使用的JSON处理工具。 在`gson-2.3.jar`中,包含了Gson库的主要功能和API,如`GsonBuilder`用于构建自定义的Gson实例,`JsonParser`用于解析...

    google-gson-2.2.4.zip

    尽管较新的版本可能包含更多功能和优化,但对于那些对稳定性和兼容性有较高要求的项目,2.2.4仍然是一个可靠的选择。 使用Gson库,开发人员可以轻松地在Java应用和JSON数据之间构建桥梁,简化数据操作,提高代码的...

    Gson_User_Guide.pdf

    不过,Gson在处理集合时有一些限制,这些限制包括对于某些特定类型的集合处理上可能需要额外的配置。 9. 泛型类型序列化和反序列化 Gson能够处理泛型类型,但是需要注意的是泛型信息在运行时会被擦除,因此需要...

    gson gson gson

    6. **日期和时间的处理**: Gson默认对日期的处理可能不满足所有场景,因此可以使用`JsonSerializer`和`JsonDeserializer`接口自定义日期格式。 7. **流式API(JsonWriter和JsonReader)**: 对于大量或复杂的JSON...

    google-gson-2.2.4

    Gson 2.2.4版本还包含了对JSON解析错误的处理机制,如使用`JsonParser`类可以逐个解析JSON元素,如果在解析过程中遇到问题,它会抛出异常,帮助开发者定位问题。 除此之外,这个版本可能已经修复了之前版本中的一些...

    gson2.8.0和2.8.6.rar

    JAR(Java Archive)是Java平台下的一个可执行文件格式,用于集合多个类文件和相关的元数据到一个文件中,便于分发和运行。在提供的压缩包中,有两个JAR文件——`gson-2.8.0.jar`和`gson-2.8.6.jar`,它们分别对应...

    gson内涵两个版本.zip

    在实际使用中,如果你的项目依赖于旧的Gson特性并且对兼容性有较高要求,可以选择使用gson-1.4.jar。但是,如果需要最新的功能和更好的性能,或者你的项目使用了Java 8或更高版本的特性,那么gson-2.8.0.jar将是更...

    Tutorialspoint Gson HttpClient Java9 Python 数据结构 SciPy Thymeleaf 教程

    在本教程中,我们将深入探讨一系列关键的编程和数据分析技术,包括Gson、HttpClient、Java 9、Python数据结构、SciPy以及Thymeleaf。这些技术在现代软件开发和数据分析领域都扮演着重要的角色。 首先,让我们从Gson...

    google-Gson1.7.1

    - 错误处理:在1.7.1版本中,Gson对错误处理进行了优化,提高了容错能力,减少了因JSON数据异常导致的程序崩溃。 - 性能提升:针对序列化和反序列化的速度进行了优化,提高了处理大量数据时的效率。 - 兼容性增强...

    gson-2.2.1_gson-2.2.1_

    4. 支持复杂数据结构:Gson可以处理各种复杂的Java数据结构,包括数组、集合、Map以及嵌套的对象。 5. 性能优秀:Gson在处理大量数据时表现出良好的性能,对于大型项目来说是一个可靠的解决方案。 6. 错误处理:...

    gson各版本jar包(1.1-2.8.5)

    总之,Gson是一个强大的工具,能够方便地处理JSON数据,无论是在Android应用、服务器端应用还是其他Java项目中,都是处理JSON的首选库之一。通过这个包含多个版本的jar包,开发者可以根据项目的具体需求来选择最合适...

    Gson读取java对象

    对于数组或集合类型,Gson同样能处理。如果你有一个`User`对象的列表: ```java List&lt;User&gt; userList = new ArrayList(); // 添加用户到list... ``` 你可以这样转换整个列表: ```java String jsonList = gson.to...

    Gson User Guide pdf(英文)

    4. **任意复杂度的支持**:Gson 能够处理任意复杂的 Java 对象结构,包括嵌套对象、集合类型等。 #### 三、性能与可扩展性 Gson 在设计上考虑到了性能和可扩展性的平衡。其内部实现了高效的 JSON 处理算法,使得...

    gson fastjson jar包

    在给定的文件中,有两个版本的Gson jar包:gson-2.2.1.jar和gson-2.6.2.jar,后者是较新的版本,可能包含更多改进和修复。 **Fastjson** 是阿里巴巴开发的一个高性能的JSON库,它同样提供了Java对象与JSON数据之间...

    Gson解析Json数据

    在Java开发中,处理JSON数据是一项常见的任务,Google推出的Gson库为我们提供了高效且便捷的解决方案。Gson库能够将Java对象转换成JSON字符串,同时也能将JSON文本解析成对应的Java对象,使得JSON数据的处理变得简单...

    解析Json的gson-2.7.jar

    **Gson库详解** 在Java开发中,数据交换与存储经常需要用到JSON...总的来说,Gson-2.7.jar作为Gson库的一个版本,提供了一套强大且易用的JSON处理方案,广泛应用于Java开发中,极大地简化了JSON数据的处理工作。

    使用gson,java对象和json字符串之间相互转化

    Gson不仅可以处理简单的Java对象,还可以处理复杂的类型,如集合、数组和嵌套的对象。例如,如果有包含多个`Person`的列表: ```java List&lt;Person&gt; peopleList = Arrays.asList( new Person("王五", 40), new ...

    java操作json的类库 google-gson

    Java操作JSON的类库Google-Gson是开发人员在处理JSON数据时的一个强大工具。它以其稳定性和易用性而闻名,被广泛应用于各种Java项目中。Google-Gson库允许我们将Java对象转换为JSON字符串,反之亦然,极大地简化了...

Global site tag (gtag.js) - Google Analytics