JSON快速入门【使用Jackson解析器】

1、json的概念:JavaScript 对象表示法(JavaScript Object Notation)
		Student s = new Student();
		s.setName="张三";
		s.setAge=20;
		s.setSex="男";

 - 1.1 举例:var student={"name": "张三", age: 23, 'gender': true};
 - 1.2 作用:
		* JSON 是存储和交换文本信息的语法。类似 XML;
        * JSON 比 XML 更小、更快,更易解析;
        * 进行数据的传输;
 		* JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
        
2、语法
-	2.1 基本规则:
		# 数据在“键值对”中:json数据有键值对构成;
			* 键用引号【单双引号都可以】引起来,也可以不用引号;
				举例:var student={"name": "张三", age: 23, 'gender': true};
			* 值可以取得的类型是:
                1.数字(整数或浮点数)
                2.字符串(在双引号中)
                3.逻辑值(true 或 false)

				4.数组(在方括号中){"student":[{},{}]}
				
     var persons = {
		         "persons": [
		             {"name": "张三", "age": 23, "gender": true},
		             {"name": "李四", "age": 24, "gender": true},
		             {"name": "王五", "age": 25, "gender": false}
		         ]
		     };
	alert("数据格式:"+persons);
	
                5.对象(在花括号中){"address":{"province":"河南"....}}
                6.null
          # 数据由逗号分隔:多个键值对由逗号分隔;
          # 花括号保存对象:使用{}定义json格式
          # 方括号保存数组:[]
    2.2 获取数据:
			* json对象.键名 alert("第一种:"+student.name);
            * json对象["键名"] alert("第二种:"+student['name']);
            * 数组对象[索引] 
            * 遍历   
	      //基本格式
	            var ps={"name": "张三", age: 23, 'gender': true};
	            //复杂格式
	            var ps2= [{"name": "张三", "age": 23, "gender": true},
	                    {"name": "李四", "age": 24, "gender": true},
	                    {"name": "王五", "age": 25, "gender": false}];
	            //获取ps对象中所有的键和值
	            //for in 循环
	
	            for(var key in ps){
	                alert(key+":"+ps[key]);
	            }
	
	           //获取ps中的所有值
	            for (var i = 0; i < ps2.length; i++) {
	                var p = ps2[i];
	                for(var key in p){
	                    alert(key+":"+p[key]);
	                }
	            }
3、JSON数据和Java对象的相互转换
	# JSON解析器
		* 常见的解析器:
			fastjson【阿里巴巴】、jackson【springMVC内置的解析器】
            Jsonlib【官方出品】、Gson【谷歌提供】
	3.1 Java对象转为JSON
    	# 使用步骤:
			1. 导入jackson的相关jar包
			2. 创建Jackson核心对象 ObjectMapper
			3. 调用ObjectMapper的相关方法进行转换
                1. 转换方法:
                # writeValue(参数1,obj):
                    * 参数1:
                         File:将obj对象转换为JSON字符串,并保存到指定的文件中
                         Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
                         OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
                # writeValueAsString(obj):将对象转为json字符串
                     * 举例:
@Test
  public void test1() throws Exception {

      //1.创建Student对象
      Student s = new Student();
      s.setName("张三");
      s.setAge(23);
      s.setSex('男');

      //2.创建Jackson的核心对象  ObjectMapper
      ObjectMapper mapper = new ObjectMapper();

      //3.转换


      //writeValue,将数据写到d://a.txt文件中
      mapper.writeValue(new File("d://a.txt"),s);

      //writeValue.将数据关联到Writer中
      mapper.writeValue(new FileWriter("d://b.txt"),s);


      //将s对象转化为json写到输出流中响应到前端
      //mapper.writeValue(response.getOutputStream(),s);

      String json = mapper.writeValueAsString(s);
      //JSON格式:{"name":"张三","age":23,"gender":"男"}
      System.out.println(json);

  }
2. 注解:
               1. @JsonIgnore:排除属性。
               2. @JsonFormat:属性值得格式化
                  @JsonFormat(pattern = "yyyy-MM-dd")
		*	举例:
                   @Test
                   public void test2() throws Exception {
                       //1.创建Person对象
                       Student s = new Student();
                       s.setName("张三");
                       s.setAge(23);
                       s.setSex('男');
                       s.setBirthday(new Date());

                       //2.转换
                       ObjectMapper mapper = new ObjectMapper();
                       String json = mapper.writeValueAsString(s);
                       System.out.println(json);
                   }

           3. 复杂java对象转换
               1. List:数组
               	# 举例:
                       @Test
                       public void test3() throws Exception {
                           //1.创建Person对象
                           Student s = new Student();
                           s.setName("张三");
                           s.setAge(23);
                           s.setSex('男');
                           s.setBirthday(new Date());

                           Student s1 = new Student();
                           s1.setName("李四");
                           s1.setAge(24);
                           s1.setSex('女');
                           s1.setBirthday(new Date());

                           Student s2 = new Student();
                           s2.setName("王五");
                           s2.setAge(25);
                           s2.setSex('男');
                           s2.setBirthday(new Date());

                           //创建List集合
                           List<Student> ps = new ArrayList<Student>();
                           ps.add(s);
                           ps.add(s1);
                           ps.add(s2);

                           //2.转换
                           ObjectMapper mapper = new ObjectMapper();
                           String json = mapper.writeValueAsString(ps);
                           System.out.println(json);
                       }
2. Map:对象格式一致
       	# 举例:   	
        @Test
        public void test4() throws Exception {
            //1.创建map对象
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("name","张三");
            map.put("age",23);
            map.put("sex","男");

            //2.转换
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(map);

            System.out.println(json);
        }
3.2 JSON转化为java对象
	# 使用步骤
		1. 导入jackson的相关jar包
        2. 创建Jackson核心对象 ObjectMapper
        3. 调用ObjectMapper的相关方法进行转换
            1. readValue(json字符串数据,Class)
    # 举例:
@Test
            public void test5() throws Exception {
               //1.初始化JSON字符串
                String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":23}";

                //2.创建ObjectMapper对象
                ObjectMapper mapper = new ObjectMapper();
                //3.转换为Java对象 Person对象
                Student stu = mapper.readValue(json, Student.class);
                System.out.println(stu);
            }

4、测试web及使用工具类
-------------------- servlet编写-------------------------------

@WebServlet("/jsonServlet")
public class JsonServlet extends HttpServlet {
      
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Person对象
        Student s = new Student();
        s.setName("张三");
        s.setAge(23);
        s.setSex('男');
        s.setBirthday(new Date());

        //2.转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(s);
        System.out.println(json);
        //使用工具类
        //String stu = JsonUtil.writeValueAsString(s);
        //System.out.println(stu);
        //3、响应
        //设置json响应格式
        response.setContentType("application/json;charset=utf-8");
        //美化json
        //mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.writeValue(response.getOutputStream(), s);
        //使用工具类
        JsonUtil.writeValue(s, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

--------------------------------jsp------------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试json</title>
</head>
<body>
	<a href="<%=request.getContextPath() %>/jsonServlet">点击</a>
</body>
</html>
【注意】 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
        1. $.get或者post(type):将最后一个参数type指定为"json"
        2. 在服务器端设置MIME类型
		response.setContentType("application/json;charset=utf-8");
3.3 美化json
	mapper.enable(SerializationFeature.INDENT_OUTPUT);
	* 在火狐浏览器中会自动美化json;
	* 在谷歌浏览器中不会可通过上述代码完成;