JSON学习笔记

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON学习笔记相关的知识,希望对你有一定的参考价值。

目录

JSON概念

JSON语法

JSON语法基本规则

 读取JSON数据

JSON数据与Java数据的相互转换

概述

JSON转为Java对象

Java对象转换为JSON

案例之校验用户名是否存在


JSON概念

JSON全名称是javascript Object Notation,即JavaScript对象表示法。

Java的对象表示:

Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");

JavaScript的对象表示:

var p = {"name":"张三","age":23,"gender":"男"};

JSON介绍:

  • json现在多用于存储和交换文本信息的语法
  • 进行数据的传输
  • JSON 比 XML 更小、更快,更易解析。

JSON语法

JSON语法基本规则

1、数据在键/值对中:JSON数据由键值对构成。

  • 键可以用引号(单双引号都行)引起来,也可以不使用引号引起来。
  • 值的取值类型有:数字(整数或浮点数)、字符串(用双引号引起来)、布尔值(true或false)、数组(在方括号中)、对象(在花括号中)、null。
# 值是数字类型
{age: 10, score: 78.5}
# 值是字符串类型
{name: "张三", sex: "m"}
# 值是布尔值类型
{flag: true}
# 值是数组类型
{names: ["zhangsan", "lisi", "wangwu"]}
{students: [{name: "zhangsan"}, {name: "lisi"}]}
# 值是对象类型
{student: {name: "zhangsan", age: 18, flag: true}}
# 值是null类型
{value: null}

2、数据由逗号分隔:多个键值对用逗号进行分隔

{key1: value1, key2: value2, key3: value3, ...}

3、花括号保存对象:使用{}定义json格式的对象,又可以嵌套其他数据类型的值。

{student: {name: "zhangsan", hobbies: ["play", "read", "listen"]}}

4、方括号保存数组:[1,2,3,4,5],又可以嵌套其他数据类型的值。

[{name1:"zhangsan"},{name2:"lisi"}]
[1,2,3,4,5,6]

 读取JSON数据

读取通常是指在前端使用JavaScript读取JSON格式数据,后端Java不采用此语法:

# 读取对象类型中指定键的值
json对象.键名
json对象["键名"]

# 读取JSON数组中的值
数组对象[索引]

# 遍历对象
for (键名 in 对象) {
    # key为键名;对象[key]为键值
}

# 遍历数组
for (var i=0; i<数组.length; i++) {
    # 数组[i]获取数组的值
}

实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>json遍历</title>
</head>
<body>
<script>
    // 遍历对象
    // 键名可以不加引号,也可以加单引号或双引号
    var person1 = {name: "张三", age: 23, sex: "m"};
    var person2 = {"name": "张三", "age": 23, "sex": "m"};
    var person3 = {'name': "张三", 'age': 23, 'sex': "m"};

    // 获取person对象中所有的键和值
    // for in 循环
    for (key in person1) {
        // 无法使用person1.key,因为这样相当于person1."name"
        console.log(key, person1[key]);
    }

    // 遍历普通数组
    var arr=["唐僧","孙悟空","猪八戒","沙僧"];
    for (var i=0; i < arr.length; i++)
    {
        console.log(arr[i]);
    }

    // 遍历对象数组
    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++) {
        var p = ps[i];
        for (key in p) {
            console.log(key + ":" + p[key]);
        }
    }
</script>
</body>
</html>

JSON数据与Java数据的相互转换

概述

要想实现JSON数据与Java数据的相互转换,需要JSON解析器,即能够解析JSON格式数据的jar包。

常见的解析器:Jsonlib,Gson,fastjson,jackson。

本节中使用jackson,因为spring内置它,为以后打下基础。

JSON转为Java对象

将JSON转换为Java对象的步骤如下:

  • 1. 导入jackson的相关jar包
  • 2. 创建Jackson核心对象 ObjectMapper
  • 3. 调用ObjectMapper的相关方法进行转换:readValue(json字符串数据, Class)

第一步:导入相关jar包(注意,版本一定要匹配,三个版本应该一致,否则可能发生异常)

第二步:转换对象

public class Json2Java {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper=new ObjectMapper();
        String json="{\\"username\\":\\"李四\\",\\"password\\":\\"123456\\"}";
        User user = mapper.readValue(json, User.class);
        System.out.println(user);
    }
}
class User{
    private String username;
    private String password;

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                '}';
    }
}

Java对象转换为JSON

使用步骤:

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

所用方法如下:

writeValue(File resultFile, Object value);// 将value数据转换成字符串,并保存到指定文件中。其中value可以是数组、对象、List集合、Map集合等
writeValue(Writer w, Object value);// 将value数据转换成JSON字符串,然后将JSON数据填充到字符输出流中
writeValue(OuputStream os, Object value);// 将value数据转换成JSON字符串,然后将JSON字符串填充到字节输出流中
writeValueAsString(Object value);// 将value数据转换成JSON格式字符串返回,用得最多

实例:

public class Java2Json {
    public static void main(String[] args) throws IOException {
        // 1.创建Jackson核心对象 ObjectMapper
        ObjectMapper mapper=new ObjectMapper();
        // 2.调用ObjectMapper的相关方法进行转换
        // 2.1 转换实体类对象
        Person person=new Person();
        person.setUsername("张三");
        person.setPassword("123456");
        String s_obj = mapper.writeValueAsString(person);
        System.out.println(s_obj);
        // 2.2 转换List集合对象
        List<Person> personList=new ArrayList<>();
        for(int i=1;i<=5;i++){
            Person p=new Person();
            p.setUsername("张三_"+i);
            p.setPassword("123456");
            personList.add(p);
        }
        String s_list = mapper.writeValueAsString(personList);
        System.out.println(s_list);
        // 2.3 转换Map集合对象
        Map<String,Person> map=new HashMap<>();
        map.put("person1",person);
        map.put("person2",person);
        map.put("person3",person);
        String s_map = mapper.writeValueAsString(map);
        System.out.println(s_map);
    }
}

class Person{
    private String username;
    private String password;

    public Person() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                '}';
    }
}

案例之校验用户名是否存在

1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
    1. $.get(type):将最后一个参数type指定为"json"。
    2. 在服务器端设置MIME类。response.setContentType("application/json;charset=utf-8");

其中前端html页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
    <script>
        $(function () {
            $.get("checkUsernameServlet",{username:"张三",password:"123456",age:15,sex:"m"},function (data) {
                alert(data.flag+", "+data.msg)
            },"json")
        })
    </script>
</body>
</html>

 CheckUsernameServlet.java

@WebServlet("/checkUsernameServlet")
public class CheckUsernameServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求编码
        request.setCharacterEncoding("utf-8");
        // 设置MIME类型和响应编码
        response.setContentType("application/json;charset=utf-8");
        // 获取请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        // 封装实体类对象
        ResultInfo resultInfo=new ResultInfo();
        resultInfo.setFlag(true);
        resultInfo.setMsg("请求成功!");
        resultInfo.setData(parameterMap);
        // 实例化ObjectMapper对象
        ObjectMapper mapper=new ObjectMapper();
        // 将实体类对象转换成JSON格式字符串
        String s_json = mapper.writeValueAsString(resultInfo);
        // 响应到前台
        response.getWriter().print(s_json);
    }

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

class ResultInfo{
    private boolean flag;
    private String msg;
    private Object data;

    public ResultInfo() {
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

本节项目的源码地址:GitHub的Demo

以上是关于JSON学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

Android :安卓第一行代码学习笔记之 解析JSON格式数据

Delphi语言最好的JSON代码库 mORMot学习笔记1

JSON中使用jsonmapper解析的代码和步骤 学习笔记

Delphi语言最好的JSON代码库 mORMot学习笔记1

转:Delphi语言最好的JSON代码库 mORMot学习笔记1