首页 > 代码库 > Google Gson的使用

Google Gson的使用

Gson 是 Google 发布的 JSON 解析工具, 非常好用,  项目里用到 JSON 解析, 无非两种情况: 对象转化为 JSON 或 JSON 转化为对象. 下面的代码演示了这两种情况下, Gson工具的使用, 要注意, 下面的示例代码中, JSON 字符串中的 key 和 JavaBean 中的字段是一样的, 也可以不一样, 后面会说.

/**
 * Gson 的使用
 * @author Gaoyuan4122
 *
 */
public class TestGson {
	private Gson gson;
	
	@Before
	public void before() {
		gson = new Gson();
	}
	
	/**
	 * 数组放进数组或List转化为json
	 * ["aaa","bbb","ccc"]
	 * ["gaoyuan1","gaoyuan2","gaoyuan3"]
	 * @throws Exception
	 */
	@Test
	public void testToJson1() throws Exception {
		String[] ss = new String[]{"aaa","bbb","ccc"};
		String json = gson.toJson(ss);
		System.out.println(json);
		List<String> list = new ArrayList<String>();
		list.add("gaoyuan1");
		list.add("gaoyuan2");
		list.add("gaoyuan3");
		String json2 = gson.toJson(list);  
		System.out.println(json2);
	}

	/**
	 * 数据放进Map中转化为json
	 * {"age":"22","name":"gaoyuan"}
	 * @throws Exception
	 */
	@Test
	public void testToGson2() throws Exception {
		Map<String, String> map = new HashMap<String,String>();
		map.put("name", "gaoyuan");
		map.put("age", "22");
		String json = gson.toJson(map);
		System.out.println(json);
	}
	
	/**
	 * List<Map<String,String>> 转化为json
	 * [{"age":"22","name":"gaoyuan"},{"age":"23","name":"gaoyuan3"}]
	 * @throws Exception
	 */
	@Test
	public void testToGson3() throws Exception {
		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		Map<String, String> map = new HashMap<String,String>();
		map.put("name", "gaoyuan");
		map.put("age", "22");
		Map<String, String> map2 = new HashMap<String,String>();
		map2.put("name", "gaoyuan3");
		map2.put("age", "23");
		list.add(map);
		list.add(map2);
		String json = gson.toJson(list);
		System.out.println(json);
	}
	
	/**
	 * 使用gson中提供的JsonObject创建json
	 * {"response":"error","message":"用户名不存在"}
	 */
	@Test
	public void testToGson4() throws Exception{
		JsonObject jo = new JsonObject();
		jo.addProperty("response", "error");
		jo.addProperty("message", "用户名不存在");
		String json = gson.toJson(jo);  
		System.out.println(json);
	}
	
	/**
	 * List里放复杂对象转化为json
	 * User有三个普通属性, 以及一个Address对象属性
	 * [{"username":"gaoyuan","password":"111","age":22,"address":{"id":1,"name":"henan"}},{"username":"gaoyuan2","password":"222","age":23,"address":{"id":2,"name":"henan2"}}]
	 * @throws Exception
	 */
	@Test
	public void testToGson5() throws Exception{
		List<User> users = new ArrayList<User>();
		users.add(new User("gaoyuan", "111", 22, new Address(1, "henan")));
		users.add(new User("gaoyuan2", "222", 23, new Address(2, "henan2")));
		String json = gson.toJson(users);
		System.out.println(json);
	}
	
	/**
	 * Map<String,List<Object>> 转json
	 * {"response":"topic","price":100.0,"topic_list":[{"id":1,"name":"sdf","pic":"http://xxx"},{"name":"hehe","pic":"adfafdasf"}]}
	 * @throws Exception
	 */
	@Test
	public void testToGson6() throws Exception {
		Map map = new HashMap();
		map.put("response", "topic");
		List list = new ArrayList();
		list.add(new Topic(1,"sdf","http://xxx"));
		Topic topic2 = new Topic();
		topic2.setName("hehe");
		topic2.setPic("adfafdasf");
		list.add(topic2);
		map.put("topic_list", list);
		map.put("price", 100.0f);
		String json = gson.toJson(map);
		System.out.println(json);
	}
	
	/**
	 * 从json中获取需要的部分
	 * {"response":"help","helplist":[{"id":1,"title":"购物指南"},{"id":2,"title":"配送方式"},{"id":3,"title":"售后服务"},{"id":6,"title":"测试三"}],"version":"12"}
	 * 要获取 helplist
	 * [{"id":1,"title":"购物指南"},{"id":2,"title":"配送方式"},{"id":3,"title":"售后服务"},{"id":6,"title":"测试三"}]
	 * @throws Exception
	 */
	@Test
	public void testFromGson1() throws Exception {
		String json = "{\"response\":\"help\",\"helplist\":[{\"id\":1,\"title\":\"购物指南\"},{\"id\":2,\"title\":\"配送方式\"},{\"id\":3,\"title\":\"售后服务\"},{\"id\":6,\"title\":\"测试三\"}],\"version\":\"12\"}";
		JsonObject fromJson = gson.fromJson(json, JsonObject.class);
		JsonObject jsonObj = (JsonObject) fromJson.get("helplist");
		System.out.println(jsonObj.toString());
	}
	
	/**
	 * json转对象
	 * {"id":1,"title":"购物指南"} 转为 Topic对象
	 * @throws Exception
	 */
	@Test
	public void testFromGson2() throws Exception {
		String json = "{\"id\":1,\"title\":\"购物指南\"}";
		Topic topic = gson.fromJson(json, Topic.class);
		System.out.println(topic);
	}
	
	/**
	 * 从json中获取想要的部分, 并转化为List中的对象
	 * 
		{
		  "response": "topic",
		  " topic ": [
		    {
		      "id": "专题活动ID",
		      "name": "专题活动名称",
		      "pic": "图片URL"
		    },
		    {
		      "id": "专题活动ID",
		      "name": "专题活动名称",
		      "pic": "图片URL"
		    }
		  ] 
		}
	 * 
	 * @throws Exception
	 */
	@Test
	public void testFromGson3() throws Exception {
		String json = "{\"response\":\"topic\",\"topic\": [{\"id\": \"专题活动ID\",\"name\": \"专题活动名称\",\"pic\": \"图片URL\"},{ \"id\": \"专题活动ID\", \"name\": \"专题活动名称\", \"pic\": \"图片URL\" }]}";
		JsonObject jsonObj = gson.fromJson(json, JsonObject.class);
		Type type = new TypeToken<List<Topic>>(){}.getType();
		List<Topic> topics = gson.fromJson(jsonObj.get("topic"), type);
		System.out.println(topics);
	}
	
	@After
	public void after() {
		gson = null;
	}
}

对应的 JavaBean 这里就不再给出了.

如果 JSON 字符串中的 key 和 JavaBean 对象中的字段不一样, 需要在 JavaBean 的字段上加一个注解:

	@SerializedName("user_id")
	private int userId;
加了这个注解之后, JSON 和 JavaBean 的互相转化就会按照注解配置的进行了.

除此之外, 还有一些常用的方法:

// 将 JSON 字符串转化为一个 JsonElement, 在 Gson 中所有的 JSON 元素都是 JsonElement, 有四个子类: JsonArray, JsonNull,
// JsonObject, JsonPrimitive, 前面三个比较常用.
JsonElement jsonElement = new JsonParser().parse(jsonStr);
// 判断 JsonElement 是否为 JsonArray
if (jsonElement.isJsonArray()) {
    // ...
}
// 将 JsonElement 转化为 JsonArray
JsonArray jsonArray = element.getAsJsonArray();
// 将 JsonElement 转化为 JsonObject
JsonObject fontsObject = jsonElement.getAsJsonArray().get(1).getAsJsonObject();
// 获取 JsonElement 的值, 注意这个方法和toString返回的是不同的.
jsonArray.get(0).getAsString()

基本的用法就是这些, 还可以参考如下博客:

http://blog.csdn.net/lk_blog/article/details/7685169



Google Gson的使用