什么是json(转载:https://www.bejson.com/knownjson/maintlogin.jsp)
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度,
那么,JSON到底是什么?
JSON就是一串字符串 只不过元素会使用特定的符号标注。
-
- {} 双括号表示对象
- [] 中括号表示数组
- "" 双引号内是属性或值
- : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象
而 [{"name": "Michael"},{"name": "Jerry"}] 就表示包含两个对象的数组
当然了,你也可以使用 {"name":["Michael","Jerry"]} 来简化上面一部,这是一个拥有一个name数组的对象
注意:
{name:‘json‘}在检验时通过不了,那是因为JSON官网最新规范规定
如果是字符串,那不管是键或值最好都用双引号引起来,所以上面的代码就是{"name":"json"}
JSON与XML比较
- 可读性:XML胜出;
- 解码难度:JSON本身就是JS对象(主场作战),所以简单很多;
- 流行度:XML已经流行好多年,但在AJAX领域,JSON更受欢迎。
把Java对象转换成JSON对象
apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串。也可以把JavaBean转换成JSON字符串
json-lib的核心jar包有: json-lib.jar
json-lib的依赖jar包有:commons-lang.jar、commons-beanutils.jar、commons-logging.jar、commons-collections.jar、ezmorph.jar
json-lib中的核心类
- JSONObject; --> 把java对象转换为json格式的对象: { }
- JSONArray; --> 把java的集合/数组对象转换为json格式数组: [ ]
代码:
//JSONObject类本身是一个Map,所以学习它很方便。 JSONObject jo = new JSONObject(); jo.put("name", "zhangSan"); jo.put("age", "18"); jo.put("sex", "male"); System.out.println(jo.toString()); Person person = new Person("liSi", 18, "female"); JSONObject jo = JSONObject.fromObject(person); System.out.println(jo.toString()); Map map = new HashMap(); map.put("name", "wangWu"); map.put("age", "81"); map.put("sex", "male"); JSONObject jo = JSONObject.fromObject(map); System.out.println(jo.toString());
//JSONArray本身是一个List,所以使用起来很方便。 JSONArray ja = new JSONArray(); Person p1 = new Person("zhangSan", 18, "male"); Person p2 = new Person("liSi", 23, "female"); ja.add(p1); ja.add(p2); System.out.println(ja.toString()); Person p1 = new Person("zhangSan", 18, "male"); Person p2 = new Person("liSi", 23, "female"); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); JSONArray ja = JSONArray.fromObject(list); System.out.println(ja.toString()); Person p1 = new Person("zhangSan", 18, "male"); Person p2 = new Person("liSi", 23, "female"); Person[] persons = {p1, p2}; JSONArray ja = JSONArray.fromObject(persons); System.out.println(ja.toString());
json的ajax:$.getJSON()
$.getJSON(url,data,success(result,status,xhr));
$.getJSON("/ajax01/DServlet",function(rs){
alert(rs.birthday);
});
如果json 对象/数组中有日期类型
在servlet中进行json_lib的配置
User user = new User("李四","男",new Date()); //进行json_lib的配置,一定写在fromObject() 之前 //第一步.创建配置类 Jsonconfig sonConfig config = new JsonConfig(); //第二步: 在配置类注册转换器, 对那种数据类型进行转换 config.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor()); // 转换为json JSONObject jsonObject = JSONObject.fromObject(user,config); response.getWriter().print(jsonObject.toString());
创建DateJsonValueProcessor工具类,底层实现 SimpleDateFormat
/** * 自定义的转换器类, 必须实现JsonValueProcessor接口 * 把Date类型 转换为 yyyy-MM-dd的字符串, SimpleDateFormat * @author Administrator * */ public class DateJsonValueProcessor implements JsonValueProcessor { //转换的格式 private String format="yyyy-MM-dd"; public DateJsonValueProcessor(String format) { super(); this.format = format; } public DateJsonValueProcessor() { super(); } //JSONArray来调用 @Override public Object processArrayValue(Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } //JSONObject来调用 @Override public Object processObjectValue(String paramString, Object paramObject, JsonConfig paramJsonConfig) { return process(paramObject); } private Object process(Object value){ if(value instanceof Date){ SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(value); } //throw new RuntimeException(value+"不是java.util.Date类型"); return value==null?"":value.toString(); } }