JSON

什么是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中的核心类

  1.   JSONObject; --> 把java对象转换为json格式的对象: { }
  2.   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();
    }

}
原文地址:https://www.cnblogs.com/64Byte/p/12939686.html