一,什么是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"} 这就能得到我们想要的结果了。