JSON——概述、JSON语法、序列化和反序列化

目录


JSON概述

跳转到目录
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。

JSON是一种轻量级的数据格式,一般用于数据交互;服务器返回给客户端的数据,一般都是JSON格式或者XML格式; JSON 比 XML 更小、更快,更易解析。

JSON对象定义和基本使用

跳转到目录

1、JSON 语法

【1】定义格式

Json数据是由键值对构成的,键用引号,数据用逗号分隔,用大括号保存对象,中括号保存数组.
值得取值类型:

  数字(整数或浮点数)
  字符串(在双引号中)
  逻辑值(true 或 false)
  数组(在中括号中):{"person":[{},{}]}
  对象(在大括号中):{"address":{"province":"江西"}}
  null
var 变量名 = {
		“key” : value , 		// Number类型
		“key2” : “value” , 		// 字符串类型
		“key3” : [] , 			// 数组类型
		“key4” : {}, 			// json 对象类型
		“key5” : [{},{}] 		// json 数组
};
	var jsons = {
			"key1":"abc", // 字符串类型
			"key2":1234,  // Number
			"key3":[1234,"21341","53"], // 数组
			"key4":{                    // json类型
				"key4_1" : 12,
				"key4_2" : "kkk"
			},
			"key5":[{                  // json数组
			    "key5_1_1" : 12,
			    "key5_1_2" : "abc"
			},{
			    "key5_2_1" : 41,
			    "key5_2_2" : "bbj"
			}]
	};

【2】获取数据

方法一:json对象.键名
方法二:json对象["键名"]
方法三:数组对象[索引]
<script>
        var json2 = {
            "key1": "abc",
            "key2": 1234,
            "key3": [1234, true, "hello"],
            "key4": {
                "key4_1": 41,
                "ley4_2": "zy"
            },
            "key5": [{
                "key5_1_1": 511,
                "key5_1_2": "512"
            }, {
                "key5_2_1": 521,
                "key5_2_2": "522",
                "key5_2_3": false
            }]
        };

        // 访问json的属性
        alert(json2.key1);
        alert(json2.key3[1]);
        alert(json2.key4.key4_1);
        alert(json2.key4[0].key5_1_1);
</script>

JSON对象和字符串对象的互转

跳转到目录

  • JSON.stringify( json ); 此方法可以把一个json对象转换成为json字符串

  • JSON.parse( jsonString ); 此方法可以把一个json字符串转换成为json对象

<script type="text/javascript">
	// 一个json对象
	var obj = {
		"a" : 12,
		"c" : "str"
	};
	// 把json对象转换成为字符串对象
	var objStr = JSON.stringify(obj);
	// 
	alert(objStr);
	// 把json对象的字符串,转换成为 json对象
	var jsonObj = JSON.parse(objStr);
	alert(jsonObj);
</script>

在这里插入图片描述
1、常见的JSON解析器
Jsonlib、Gson、fastjson、jackson

2、序列化和反序列化
序列化: Java对象 —> JSON/XML
反序列化: JSON/XML —> Java对象

Java对象转为JSON数据

跳转到目录
步骤:

  • 导入 Jackson 相关 jar 包
  • 创建 Jackson 核心对象 ObjectMapper
  • 调用 ObjectMapper 的相关方法进行转换

转换方法:

  • writeValue(参数,obj)
    • 参数为File:将obj 对象转换为Json字符串,并保存到指定的文件中
    • 参数为 Writer:将obj对象转换为Json字符串,并将 json 数据填充到字符输出流中
    • 参数为 OutputStream:将 obj 对选哪个转换为Json字符串,并将json 数据填充到字节输出流中
      writeValueAsString(obj):将对象转换为json字符串

注解:在属性前面加注解

  • @JsonIgnore:排除属性
  • @JsonFormat:属性值的格式化
// Java对象转为JSON字符串(反序列化操作)
@Test
public void test1() throws Exception{
    //1. 创建Person对象
    Person p = new Person();
    p.setName("朝阳");
    p.setAge(22);
    p.setGender("man");

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

    //3. 转换
    String json = mapper.writeValueAsString(p);
    // System.out.println(json);   // {"name":"朝阳","age":22,"gender":"man"}

    // writeValue(File, obj) 将数据写入到e://a.txt文件中
    // mapper.writeValue(new File("e://a.txt"), p);

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

@Test
public void test2() throws Exception{
    Person p = new Person();
    p.setName("张三");
    p.setAge(22);
    p.setGender("男");
    p.setBirthday(new Date());
    /**
     *     // @JsonIgnore //忽略该属性
     *     @JsonFormat(pattern = "yyyy-MM-dd") // 属性值格式化
     *     private Date birthday;
     */

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

    System.out.println(json); //{"name":"张三","age":22,"gender":"男","birthday":1581061966873}
}

@Test
public void test3() throws Exception{
    //1.创建Person对象
    Person p = new Person();
    p.setName("张三");
    p.setAge(23);
    p.setGender("男");
    p.setBirthday(new Date());

    Person p1 = new Person();
    p1.setName("张三");
    p1.setAge(23);
    p1.setGender("男");
    p1.setBirthday(new Date());

    Person p2 = new Person();
    p2.setName("张三");
    p2.setAge(23);
    p2.setGender("男");
    p2.setBirthday(new Date());

    // 创建List集合
    List<Person> ps = new ArrayList<>();
    ps.add(p);
    ps.add(p1);
    ps.add(p2);

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

    System.out.println(json);
}

@Test
public void test4() throws Exception {
    Map<String, Object> map = new HashMap<>();
    map.put("name", "张三");
    map.put("age", 23);
    map.put("gender", "男");

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

    System.out.println(json);
}
JSON数据转Java对象

跳转到目录
步骤:

  • 导入 Jackson 相关 jar 包
  • 创建 Jackson 核心对象 ObjectMapper
  • 调用 ObjectMapper 的相关方法进行转换

转换方法:

  • readValue(json字符串数据,Class)
 // JSON字符串转换为Java对象(序列化操作)
 @Test
 public void test5() throws Exception{
     // 初始化JSON字符串
     String json = "{\"name\":\"张三\",\"age\":22,\"gender\":\"男\",\"birthday\":1581061966873}";

     // 创建ObjectMapper对象
     ObjectMapper mapper = new ObjectMapper();

     // 转换为Java对象(Person)
     Person p = mapper.readValue(json, Person.class);
     System.out.println(p);
 }

Demo

跳转到目录
在这里插入图片描述

  • sql
CREATE TABLE kw(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
INSERT INTO kw VALUES(NULL,'小米手机');
INSERT INTO kw VALUES(NULL,'小米饭怎么做');
INSERT INTO kw VALUES(NULL,'小米耳机');
INSERT INTO kw VALUES(NULL,'小米音响');
INSERT INTO kw VALUES(NULL,'小米手环');

INSERT INTO kw VALUES(NULL,'华为手机');
INSERT INTO kw VALUES(NULL,'华为耳环');
INSERT INTO kw VALUES(NULL,'华为笔记本');
INSERT INTO kw VALUES(NULL,'华为p20');
INSERT INTO kw VALUES(NULL,'华为路由器');
INSERT INTO kw VALUES(NULL,'华为手环');

INSERT INTO kw VALUES(NULL,'蘑菇');
INSERT INTO kw VALUES(NULL,'小鸡炖蘑菇');
INSERT INTO kw VALUES(NULL,'蘑菇有毒');
INSERT INTO kw VALUES(NULL,'蘑菇可以吃吗');
INSERT INTO kw VALUES(NULL,'麻辣香菇');

INSERT INTO kw VALUES(NULL,'黄瓜');
INSERT INTO kw VALUES(NULL,'西瓜');
INSERT INTO kw VALUES(NULL,'冬瓜');
INSERT INTO kw VALUES(NULL,'甜瓜');
INSERT INTO kw VALUES(NULL,'黄瓜是家电吗');
  • jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<script type="text/javascript"
        src="${pageContext.request.contextPath }/js/jquery.js"></script>
<script type="text/javascript">
    $(function () {
        $("#tid").keyup(function () {

            // 每次请求后都情况
            $("#did").empty().hide();

            // 获取当前输入框的值
            var content = $(this).val();

            // 判断是否需要发请求
            if ("" == content) {
                return;
            }

            // 发送请求给服务
            $.ajax({
                url: "http://localhost:8080/ajaxdemo/searchServlet",
                data: "content=" + content,
                type: "get",
                success: function (data) {

                    // 注意: data就是字符串,是JSON格式的字符串
                    // 把JSON字符串转换为JSON对象
                    var jsonObj = JSON.parse(data);

                    // 判断是否有数据
                    if (jsonObj.length > 0) {

                        for (keyword of jsonObj) {
                            var keywordName = keyword.name;

                            // 拼标签
                            var divTag = "<div οnmοuseοver='m1(this)' οnmοuseοut='m2(this)'>" + keywordName + "</div>";

                            // jQuery DOM操作
                            $("#did").append(divTag);
                        }
                        // 让下方div显示出来
                        $("#did").show(); // 动画方法,实际是修改display的属性值
                    }

                }
            })

            // 服务器查询, 接收数据,添加到下方div中
        });
    })

    function m1(obj) {
        $(obj).css("backgroundColor", "gray");
    }

    function m2(obj) {
        $(obj).css("backgroundColor", "white");
    }

</script>
<title>Insert title here</title>
</head>
<body>
<center>
    <div>
        <h1>Sunny搜索</h1>
        <div>
            <input name="kw" id="tid"><input type="button" value="Sunny一下">
        </div>
        <div id="did" style="border: 1px solid red;width: 171px;position:relative;left:-34px;display:none">

        </div>
    </div>
</center>
</body>
</html>
  • Servlet
@WebServlet("/checkNameServlet")
public class CheckNameServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        // 接收username
        String username = request.getParameter("username");

        // 调用service, 查看是否存在
        UserService service = new UserService();
        int count = service.count(username);

        // 返回1或0
        if (count > 0){
            response.getWriter().print("1");
        } else {
            response.getWriter().print("0");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
  • Service
public class KeywordService {
    public List<Keyword> likeName(String content) {
        return new KeywordDao().likeName(content);
    }
}
  • Dao
public class KeywordDao {
    public List<Keyword> likeName(String content) {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

        String sql="SELECT * FROM kw WHERE name LIKE ?";

        //执行sql语句
        try {
            return qr.query(sql,new BeanListHandler<>(Keyword.class),"%"+content+"%");
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
  • domain
public class Keyword {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Keyword{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值