JSON的基操笔记、Jackson解析器和Ajax结合案例

6 篇文章 0 订阅

一、概念

  1. JavaScript Object Notation JavaScript对象表示法
  • json现在多用于存储和交换文本信息的语法
  • 进行数据的传输
  • JSON 比 XML 更小、更快,更易解析。
  1. 语法:
  2. 基本规则
  • 数据在名称/值对中:json数据是由键值对构成的
    • 键用引号(单双都行)引起来,也可以不使用引号
    • 值得取值类型:
      1. 数字(整数或浮点数)
      2. 字符串(在双引号中)
      3. 逻辑值(true 或 false)
      4. 数组(在方括号中) {“persons”:[{},{}]}
      5. 对象(在花括号中) {“address”:{“province”:“陕西”…}}
      6. null
  • 数据由逗号分隔:多个键值对由逗号分隔
  • 花括号保存对象:使用{}定义json 格式
  • 方括号保存数组:[]
  1. 获取数据:
  • json对象.键名
  • json对象[“键名”]
  • 数组对象[索引]
  • 遍历

一、 JSON格式和数据的获取

  1. 定义基本格式
  • 获取name的值 有两种:(1) json对象.键 (2) json对象[“键”]
   var person = {"name": "张三", age: 23, 'gender': true};

   //获取name的值 有两种 1.json对象.键 2.json对象["键"]
   //var name = person.name;
   var name = person["name"];
  1. 嵌套格式 JSON—数组—JSON
    var persons = {
            "persons": [
                {"name": "张三", "age": 23, "gender": true},
                {"name": "李四", "age": 24, "gender": true},
                {"name": "王五", "age": 25, "gender": false}
                ]
        };
        //获取王五值
        var name1 = persons.persons[2].name;
  1. 数组----JSON
 var ps = [{"name": "张三", "age": 23, "gender": true},
            {"name": "李四", "age": 24, "gender": true},
            {"name": "王五", "age": 25, "gender": false}];
        //获取李四值,弹出
        alert(ps[1].name);

二、 JSON的遍历获取键值

1.使用for in循环遍历json,获取值不可以使用person.name 这种方法,因为它会自动个key加上引号。

  //1.定义基本格式
        var person = {"name": "张三", age: 23, 'gender': true};//获取name的值
        //遍历使用for  in 循环
        for (var key in person){
            // 在for in循环中获取值不可以使用person.name 这种,因为它会自动个key加上引号
            var value = person[key];
            alert(key+":"+value);
        }

2.使用双重for循环 正常for循环和for in 循环遍历嵌套的json

      //2.嵌套格式   []———> {}
      var ps = [{"name": "张三", "age": 23, "gender": true},
          {"name": "李四", "age": 24, "gender": true},
          {"name": "王五", "age": 25, "gender": false}];
      for (var i = 0; i < ps.length; i++) {
          //每一个p就是一个json
          var p = ps[i];
          for (var key in p){
              //然后遍历每一个json
              var value = p[key];
              alert(key+":"+value);
          }
      }

二、Java对象和Json对象的相互转换

String 类型 Json格式的 str如何通过key-value得到数据。

		 String str = {"wendu":"100","shidu":"200"};
	     JSONObject object = new JSONObject(str);
	     int wendu = object.getInt("wendu");
	     String shidu = object.getString("shidu");

Java装Json:

  1. 使用jackson解析器的核心对象ObjectMapper,调用writeValu方法
package com.itcase.Jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itcase.domain.Person;
import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Jackson_test1 {
    @Test
    public void test1() throws IOException {
        //java对象转为json对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(22);
        p.setGender("男");
        //创建jackson的核心对象ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //1.mapper.writeValueAsString(Object) 将object转换为json对象
        String json = mapper.writeValueAsString(p);
        System.out.println(json);
        /*
        2.mapper.writeValue(参数1,Object)
          参数1:
          File:将obj对象转换为JSON字符串,并保存到指定的文件中
          Writer:将obj对象转换为JSON字符串,并保存到指定的字符输出流
          OutputStream:将obj对象转换为JSON字符串,并保存到指定的字节输出流
         */
        mapper.writeValue(new File("E:\\a.txt"),p);
        mapper.writeValue(new FileWriter("E:\\b.txt"),p);
    }
}

  1. Json的注解

在Person类中加入日期属性private Date birthday;

    public void test2() throws JsonProcessingException {
        //java对象转为json对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(22);
        p.setGender("男");
        p.setBirthday(new Date());
        ObjectMapper mapper = new ObjectMapper();
        //1.mapper.writeValueAsString(Object) 将object转换为json对象
        String json = mapper.writeValueAsString(p);
        System.out.println(json);
    }

结果:

{“name”:“张三”,“age”:22,“gender”:“男”,“birthday”:1605156999652}

在属性上加一个注解@JsonIgnore:

    @JsonIgnore
    private Date birthday;

结果如下:可以忽略这个日期属性

{“name”:“张三”,“age”:22,“gender”:“男”}

另一个注解:@JsonFormat(pattern = “”)

@JsonFormat(pattern = "yyyy年--MM月--dd日")
    private Date birthday;

结果如下:可以定义日期格式

{“name”:“三”,“age”:22,“gender”:“男”,“birthday”:“2020年–11月–12日”}

  1. List和Map的转换
    List.add(Person) :List装Person对象转成Json后成为数组:

[{“name”:“张三”,“age”:“22”},{" “:” “,” “:” “},{” “:” “,” “:” "}]这种格式

List.put(key,value):和装上面Person对象的输出格式一样

Json转Java:
mapper.readValue(json对象, java.class);
/是转义字符

    @Test
    public void test3() throws IOException {
        String json = "{\"name\":\"张三\",\"age\":22,\"gender\":\"男\"}";
        ObjectMapper mapper = new ObjectMapper();
        //将json转换为java对象
        Person person = mapper.readValue(json, Person.class);
        System.out.println(person);
    }

结果:

person{name=‘张三’, age=22, gender=‘男’}

三、案例

需求:失去鼠标焦点时候通过ajax和json进行客户端和服务器的通信,判断用户名是否存在。类似百度搜索,输入后下拉框数据的变化。

注意:服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:

  1. $.get(type):将最后一个参数type指定为"json"
  2. 在服务器端设置MIME类型
    response.setContentType(“application/json;charset=utf-8”);
    页面:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        //在页面加载完
        $(function () {
            //绑定一个blur 失去焦点的function
            $("#username").blur(function () {
                //获取到用户输入的value
                var username = $(this).val();
                //发送一个ajax请求 url ,键值,返回数据,type类型接收
                $.get("findUserServlet",{username:username},function (date) {
                    //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
                    //                            {"userExsit":false,"msg":"用户名可用"}
                    //设置一个span用于显示接收到的msg
                    var s_username = $("#s_username");
                    if (date.userExsit){
                        //用户存在 显示msg信息
                        s_username.css("color","pink");
                        s_username.html(date.msg);

                    }else{
                        //用户不存在
                        s_username.css("color","green");
                        s_username.html(date.msg);
                    }

                },"json");
            });
        });
    </script>
</head>
<body>
<form>
    <input type="text" name="username" id="username" placeholder="请输入用户名">
    <span id="s_username"></span>
    <br>
    <input type="password" name="password" placeholder="请输入密码"><br>
    <input type="submit" value="登录">

</form>

</body>
</html>

服务器端:

package com.itcase;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset = utf-8");
//        response.setContentType("application/json;charset=utf-8");可以不用设置页面的$.get()的最后一个参数type
        //1.用于接收regist.html传来的ajax请求 传来的username参数
        String username = request.getParameter("username");
        //2.设置一个map 存放数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}{"userExsit":false,"msg":"用户名可用"}
        Map<String,Object> map = new HashMap<String,Object>();
        //3.此次判断应该由service层调用dao层数据库,现在简化判断
        if ("tom".equals(username)){
            map.put("userExsit",true);
            map.put("msg","此用户名太受欢迎,请更换一个");
        }else{
            map.put("userExsit",false);
            map.put("msg","用户名可用");
        }
        //4.ObjectMapper核心对象
        ObjectMapper mapper = new ObjectMapper();
        //5.将map用输出流直接输出到页面响应
        mapper.writeValue(response.getWriter(),map);
    }

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

结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值