一,什么是JSON?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。同时也易于机器的解析和生产。它基于JavaScript,JSON采用完全独立语言的文本格式,这些特性使得JSON成为理想的数据交换语言。
二,JSON格式的对象和数组。
A.JSON对象
{属性名1:值1,属性名2:值2,属性名3:值3.....}
如:{name:"张三",age:20}
最外面用{},然后各个属性之间用“,”隔开。名称上可以使用双引号也可以使用单引号甚至可以不适用引号。
B.JSON数组
使用JSON格式来描述数组则使用“[]”,数组成员之间用“,”分隔
如:
['足球','音乐','电影']
三,在服务端生成JSON格式的数据
在AJAX应用中,如果要使用JSON格式的数据来代替XML,就必须要在服务器上生成JSON格式的数据,我们当然可以使用拼接字符串的方式来生成JSON的数据,但是这种方式代码量太大,而且容易出错,此时我们可以使用JSON-lib工具包将java中的集合或者对象转换为JSON格式的数据。JSON-lib 用于将Java中的JavaBean,map,collection,java数组和XML转换成JSON数据格式。
A.数组,Collection集合转换
String[] users={"zhangsan","lisi","wangwu"};
JSONArray jsArray=JSONArray.fromObject(users);
System.out.println(jsArray.toString());
List<String> list=new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("ccccc");
jsArray=JSONArray.fromObject(list);
System.out.pritln(jsArray.toString());
输出结果:
["zhangsan","lisi","wangwu"]
["aaaa","bbbb","ccccc"]
B.Map集合转换
Map<String,Object> map=new HashMap<String,Object>();
map.put("name","张三");
map.put("favorite",new String[]{"吃饭","睡觉","游戏"});
map.put("getFavorite","function(i){return this.favorite[i]}");
JSONObject jsObject=JSONObject.fromObject(map);
System.out.println(jsObject.toString());
输出:
{"getFavorite":function(i){return this.favorite[i]},
"name":"张三",
"favorite":["吃法”,"睡觉","游戏"]
}
C.JavaBean转换
public class Student{
private String name;
private int age;
/*setter,getter方法 必须要有 且public*/
}
转换代码:
Student stu=new Student("张三",20);
JSONObject jsObject=JSONObject.fromObject(stu);
System.out.println(jsObject.toString());
输出:
{"age":20 , "name":"张三"}
D.复合类型(比较常用)
public class Teacher{
private String name;
private Set<Student> students=new HashSet<Student>();
//省掉构造方法和setter/getter
}
Teacher teacher=new Teacher("吴老师");
teacher.getStudents().add(new Student("张三",20));
teacher.getStudents().add(new Student("李四",20));
teacher.getStudents().add(new Student("王五",20));
JSONObject jsObject=JSONObject.fromObject(teacher);
System.out.println(jsObject.toString());
输出:
{"name":"吴老师","students":[{"age":20,"name":"张三"},
{"age":20,"name":"李四"},
{"age":20,"name":"王五"},
]
}
特别注意:
一个对象的某个属性为 Date 类型时候,转换后的格式为:{"date":10,"day":3,"hours":14,"minutes":14,"month":2,"seconds":1,"time":1268201641228,"timezoneOffset":-480,"year":110},"name":"NewBaby"}
这时你会发现它把bean对象里的util.Date这个类型的所有属性一一转换出来。在实际运用过程中,大多数情况下我们希望能转化为yyyy-MM-dd这种格式,下面就讲一讲如何实现:
首先要写一个新的类JsonDateValueProcessor如下:
public class JsonDateValueProcessor implements JsonValueProcessor {
private String datePattern = "yyyy-MM-dd";
public JsonDateValueProcessor() {
super();
}
public JsonDateValueProcessor(String format) {
super();
this.datePattern = format;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
return process(value);
}
private Object process(Object value) {
try {
if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat(datePattern,
Locale.UK);
return sdf.format((Date) value);
}
return value == null ? "" : value.toString();
} catch (Exception e) {
return "";
}
}
public String getDatePattern() {
return datePattern;
}
public void setDatePattern(String pDatePattern) {
datePattern = pDatePattern;
}
}
测试代码:
JsonBean bean = new JsonBean();
bean.setName("NewBaby");
bean.setAge(1);
bean.setBorn(new Date());
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
JSONObject jo = JSONObject.fromObject(bean, jsonConfig);
System.out.println("bean->json:" + jo.toString());
打印结果:bean->json:{"age":1,"born":"2010-03-10","name":"NewBaby"}
这就能得到我们想要的结果了。