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));
}
(带更新................................)