关闭

一步一步的学习android应用开发到系统底层开发之android数据解析JSON篇

291人阅读 评论(0) 收藏 举报

Json的定义:

是一种轻量级的数据交互格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,详见官网网址:http://json.org/。

我们主要关系的是android 为我们提供了那些解析JSON常用的类:

JSONArray:

     它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔。例如:

{"employees": [{ "firstName":"Bill" , "lastName":"Gates" },{ "firstName":"George" , "lastName":"Bush" },{ "firstName":"Thomas" , "lastName":"Carter" }]}


JSONObject:
      可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。
JSONStringer:

      json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

Json 数据的基本转换:

package com.lupeng.javase.json.test;

import java.text.DateFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.lupeng.javase.json.bean.DateBean;
import com.lupeng.javase.json.bean.JavaBean;
import com.lupeng.javase.json.util.DateDeserializerUtils;
import com.lupeng.javase.json.util.DateSerializerUtils;

@SuppressWarnings("unchecked")
public class GsonTester {
	private static Gson gson = null;
	private static GsonBuilder gsonBuilder = null;

	public static void setUp() {
		gson = new Gson();
		gsonBuilder = new GsonBuilder();
	}

	/**
	 * JavaBean、Json相互转换
	 */

	public void testBeanJson() {
		JavaBean bean = new JavaBean("1001", "scott", 20, "TL");

		// Bean -> Json
		String json = gson.toJson(bean);
		System.out.println(json);

		// Json -> Bean
		bean = gson.fromJson(json, JavaBean.class);
		System.out.println(bean);
	}

	/**
	 * List转换成Json字符串
	 */

	public void testList2Json() {
		// List
		List list = new ArrayList();
		for (int i = 0; i < 5; i++) {
			list.add("element" + i);
		}
		System.out.println(list);

		// List -> Json
		String json = gson.toJson(list);
		System.out.println(json);
	}

	/**
	 * 泛型List、Json相互转换
	 */

	public void testGenericListJson() {
		// 泛型List
		List<JavaBean> list = new ArrayList<JavaBean>();
		for (int i = 0; i < 3; i++) {
			JavaBean user = new JavaBean("100" + i, "name" + i, 20 + i, "BJ"
					+ i);
			list.add(user);
		}
		System.out.println(list);

		// 泛型List -> Json
		java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<JavaBean>>() {
		}.getType();
		String json = gson.toJson(list, type);
		System.out.println(json);

		// Json -> 泛型List
		List<JavaBean> users = gson.fromJson(json.toString(), type);
		System.out.println(users);
	}

	/**
	 * Map转换成Json字符串
	 */

	public void testMap2Json() {
		// Map数据
		Map map = new HashMap();
		map.put("id", "1001");
		map.put("name", "scott");
		map.put("age", 20);
		map.put("addr", "BJ");
		System.out.println(map);

		// Map -> Json
		String json = gson.toJson(map);
		System.out.println(json);
	}

	/**
	 * 泛型Map、Json相互转换
	 */

	public void testGenericMapJson() {
		// 泛型Map数据
		Map<String, JavaBean> map = new HashMap<String, JavaBean>();
		for (int i = 0; i < 5; i++) {
			JavaBean user = new JavaBean("100" + i, "name" + i, 20 + i, "LN"
					+ i);
			map.put("100" + i, user);
		}
		System.out.println(map);

		// 泛型Map -> Json
		java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<String, JavaBean>>() {
		}.getType();
		String json = gson.toJson(map, type);
		System.out.println(json);

		// Json -> Map
		Map<String, JavaBean> users = gson.fromJson(json.toString(), type);
		System.out.println(users);

	}

	/**
	 * 带日期类型Bean、Json相互转换
	 */

	public static void testDateBeanJson() {
		// 日期Bean数据
		DateBean bean = new DateBean("1001", "scott", 20, new Date());

		// Bean(带日期属性) -> Json
		gson = gsonBuilder.registerTypeAdapter(java.util.Date.class,
						new DateSerializerUtils())
				.setDateFormat(DateFormat.LONG).create();
		String json = gson.toJson(bean);
		System.out.println(json);
		// Json -> Bean(带日期类型属性)
		gson = gsonBuilder
				.registerTypeAdapter(java.util.Date.class,
						new DateDeserializerUtils())
				.setDateFormat(DateFormat.LONG).create();
		java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<DateBean>() {
		}.getType();
		DateBean b = gson.fromJson(json, type);
		System.out.println(b);
	}

	/**
	 * 泛型日期List、Json相互转换
	 */

	public static void testDateGenericListJson() {
		// 泛型日期List
		List<DateBean> list = new ArrayList<DateBean>();
		for (int i = 0; i < 3; i++) {
			DateBean user = new DateBean("100" + i, "name" + i, 20 + i,
					new Date());
			list.add(user);
		}
		System.out.println(list);

		// 泛型日期List -> Json
		gson = gsonBuilder
				.registerTypeAdapter(java.util.Date.class,
						new DateSerializerUtils())
				.setDateFormat(DateFormat.LONG).create();
		java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<DateBean>>() {
		}.getType();
		String json = gson.toJson(list, type);
		System.out.println(json);

		// Json -> 泛型日期List
		gson = gsonBuilder
				.registerTypeAdapter(java.util.Date.class,
						new DateDeserializerUtils())
				.setDateFormat(DateFormat.LONG).create();
		List<DateBean> users = gson.fromJson(json.toString(), type);
		System.out.println(users);
	}

	public static void main(String[] args) {

		SimpleDateFormat foo = new SimpleDateFormat();
		System.out.println("foo:" + foo.format(new Date()));

		Calendar gc = GregorianCalendar.getInstance();
		System.out.println("gc.getTime():" + gc.getTime());
		System.out.println("gc.getTimeInMillis():"
				+ new Date(gc.getTimeInMillis()));
		setUp();
		testDateBeanJson();
		testDateGenericListJson();
	}
}

JsonDeserializer 日期序列化问题:

public class DateDeserializer implements JsonDeserializer<Date> {
	public Date deserialize(JsonElement json, Type typeOfT,
			JsonDeserializationContext context) throws JsonParseException {
		String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/";
		Pattern pattern = Pattern.compile(JSONDateToMilliseconds);
		Matcher matcher = pattern.matcher(json.getAsJsonPrimitive().getAsString());
		String result = matcher.replaceAll("$2");
		return new Date(new Long(result));
	}

(带更新................................)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2226次
    • 积分:74
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档