【JavaWeb】JSON详解:打包JSON数据?

一天前端问后端,我需要的数据呢?后端程序员小哥说我给你打包成json了。啊,json是个啥?我该怎么用…



1.JSON概念

JSON:JavaScript Object Notation,是JavaScript对象表示法

比如Java中的一个Person对象:

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

Person对象使用JavaScript对象表示为:

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

{"name":"张三","age":23,"gender":"男"}这样的数据,就称为JSON 格式数据,早期的JSON 就是JavaScript来表示对象的一个手段。现在的JSON 有着更广泛的应用:

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

2.JSON语法

2.1 基本规则

先说一下json语法的基本规则:

  1. 数据在 “名称/值” 对中:json数据是由键值对构成的:

    • 键是字符串类类型,用引号(单双都行)引起来,也可以不使用引号

    • 值的取值类型例子
      1数字(整数或浮点数){"number":5}{"number":12.20}
      2字符串(在双引号中){"name":"董"}
      3逻辑值(true 或 false){"isMale":true}
      4数组(在方括号中){"persons":[{},{}]}
      5对象(在花括号中){"address":{"province":"陕西","city":"西安"}}
      6null{"money":null}
  2. 数据由逗号分隔:多个键值对由逗号 , 分隔

  3. 花括号保存的是对象:使用{ }定义 json 格式

  4. 方括号保存数组:[ ]


例子:

01-json数据语法.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    
    <script>
        //1.定义基本格式
        var person = {"name": "张三", age: 23, 'gender': true};
        //打印
        console.log(person);

        //2.嵌套格式   {}———> [],嵌套数组
        var persons = {
            "persons": [
                {"name": "张三", "age": 23, "gender": true},
                {"name": "李四", "age": 24, "gender": true},
                {"name": "王五", "age": 25, "gender": false}
                ]
        };
        //打印
        console.log(persons);

        //2.嵌套格式   []———> {},数组嵌套对象
        var ps = [
            {"name": "张三", "age": 23, "gender": true},
            {"name": "李四", "age": 24, "gender": true},
            {"name": "王五", "age": 25, "gender": false}
        ];
        //打印
        console.log(ps);
    </script>

</head>
<body>

</body>
</html>

访问该页面,F12打开浏览器控制台,查看打印情况:

在这里插入图片描述
都能打印出来,说明定义的json数据格式没有问题。

2.2 获取数据

获取数据的方式是下面前三种方式,最后再演示一下遍历数据:

  1. json对象.键名
  2. json对象[“键名”]
  3. 数组对象[索引]
  4. 遍历

用简单的例子来体会一下获取数据:

02-json获取数据.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script>
        //1.定义基本格式
        var person = {"name": "张三", age: 23, 'gender': true};
        //获取name的值
        var name = person.name;//方式1
        //获取age的值
        var age = person["age"];//方式2
        //打印
        console.log(name+"-"+age);
        console.log("======================");

        //2.嵌套格式   {}———> [],嵌套数组
        var persons = {
            "persons": [
                {"name": "张三", "age": 23, "gender": true},
                {"name": "李四", "age": 24, "gender": true},
                {"name": "王五", "age": 25, "gender": false}
                ]
        };
        //获取王五值
        var Ww = persons.persons[2].name;
        //打印
        console.log(Ww);
        console.log("======================");

        //2.嵌套格式   []———> {},数组嵌套对象
        var ps = [
            {"name": "张三", "age": 23, "gender": true},
            {"name": "李四", "age": 24, "gender": true},
            {"name": "王五", "age": 25, "gender": false}
        ];
        //获取李四值
        var Ls = ps[1].name;
        //打印
        console.log(Ls);
    </script>

</head>
<body>

</body>
</html>

访问该页面,F12打开浏览器控制台,查看打印情况:

在这里插入图片描述
遍历数据:使用for in 循环

  • 获取person对象中所有的键和值
  • 获取对象数组ps中的所有值

03-json获取数据_遍历.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //1.定义基本格式
        var person = {"name": "张三", age: 23, 'gender': true};
        //2.对象数组
        var ps = [
            {"name": "张三", "age": 23, "gender": true},
            {"name": "李四", "age": 24, "gender": true},
            {"name": "王五", "age": 25, "gender": false}
        ];

        //for in 循环
        //获取person对象中所有的键和值
        for(var key in person){
            //注意:person.key 这样的方式获取不行。因为key是字符串类型,相当于  person."name",语法错误,显示获取的是undefined
            //打印
            console.log(key+":"+person[key]);
        }
        console.log("===================");

       //获取ps中的所有值,嵌套for in 循环
        for (var i = 0; i < ps.length; i++) {
            var p = ps[i];
            for(var key in p){
                console.log(key+":"+p[key]);
            }
            console.log("---------");
        }
    </script>

</head>
<body>

</body>
</html>

访问该页面,F12打开浏览器控制台,查看打印情况:

在这里插入图片描述

3.JSON数据和Java对象的相互转换

为什么需要JSON数据和Java对象的相互转换?

因为一般JSON作为数据的载体,在网络中进行传输,前面也提到了json数据传输的优势。涉及到客户端与服务器的数据交互,在服务器端,使用的是Java语言,数据以Java对象的形式使用。而浏览器客户端又能非常方便的解析JSON数据。所以开发中需要实现JSON数据和Java对象的相互转换。
在这里插入图片描述

客户端浏览器可以解析JS语言,支持JSON解析 。

数据转换时,我们一般不会手动获取数据,来拼接字符串, 最后转换JSON格式数据。

而是使用JSON解析器:里面封装了一些转换的工具类供我们使用。常见的解析器:Jsonlib,Gson,fastjson,jackson;

本文主要学习jackson解析器基本使用,因为jackson解析器是后期SpringMVC框架的内置解析器。

3.1 Java对象转换JSON

Java对象转换JSON,jackson的使用步骤:

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

3.2.1 ObjectMapper对象里面常用的转换方法

  • public void writeValue(参数1,Object obj):将对象obj转换为JSON字符串,并保存到参数1指定的地方,参数1有很多重载类型,这里介绍几个:
    • File:将obj对象转换为JSON字符串,并保存到指定的文件中
    • Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
    • OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中

  • public String writeValueAsString(Object obj):将对象转为json字符串,并返回。

这些方法都需要异常处理。


例子:将Java中的Person对象,转换为json数据。

Person.java

public class Person {
    private String name;
    private int age ;
    private String gender;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

使用JUnit单元测试,来进行转换测试,测试类:

public class JacksonTest {
	//Java对象转为JSON字符串
    @Test
    public void test1() throws Exception {//异常全部抛出
        //1.创建Person对象
        Person p  = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");

        //2.创建Jackson的核心对象  ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //3.转换
        String json = mapper.writeValueAsString(p);
        System.out.println(json);//{"name":"张三","age":23,"gender":"男"}

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

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

运行测试方法,控制台打印:

在这里插入图片描述
生成的a.txt
在这里插入图片描述
生成的b.txt

在这里插入图片描述

3.2.2 需要转换的Java对象中常用到以下两个注解

  1. @JsonIgnore:被该注解修饰的属性,转换JSON时会被排除。
  2. @JsonFormat:被该注解修饰的属性,转换JSON时属性值会被格式化。如:@JsonFormat(pattern = "yyyy-MM-dd")pattern属性可以指定格式化的形式。

例子:将Java中的Person对象,转换为json数据。

在上述Person类中,加下下面几行代码

//@JsonIgnore // 忽略该属性
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;

public Date getBirthday() {
    return birthday;
}

public void setBirthday(Date birthday) {
    this.birthday = birthday;
}

测试方法test2:

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

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

    System.out.println(json);//{"name":"张三","age":23,"gender":"男","birthday":1530958029263}
                            //{"name":"张三","age":23,"gender":"男","birthday":"2018-07-07"}
}

运行测试方法,控制台打印:

在这里插入图片描述
如果不使用@JsonFormat格式化注解:

在这里插入图片描述
这样的结果肯定不符合需求的。


3.2.3 复杂java对象转换

List和Map集合对象转换为JSON数据

  • List:转换后与数组格式一致
  • Map:转换后与对象格式一致

List:转换后与数组格式一致

测试方法test3:

@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<Person>();
    ps.add(p);
    ps.add(p1);
    ps.add(p2);

    //2.转换
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(ps);
	//打印,如果集合为空,则打印[]
    System.out.println(json);
}

运行测试方法,控制台打印:

[{"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"},{"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"},{"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"}]

Map:转换后与对象格式一致

测试方法test4:

@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("gender","男");

    //2.转换
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(map);
    //打印一下
    System.out.println(json);
}

运行测试方法,控制台输出:

{"gender":"男","name":"张三","age":23}

3.2 JSON转为Java对象

JSON转为Java对象,不常见,了解一下,jackson的使用步骤:

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

常调用ObjectMapper方法

  • public <T> T readValue(String var1, Class<T> var2):将json字符串转换为Java对象,并返回这个对象。
  • 参数说明:
    • String var1:需要转换的json字符串数据
    • Class<T> var2:转换成对象的Class对象,如 Person.class

例子:测试方法test5

//演示 JSON字符串转为Java对象
@Test
public void test5() throws Exception {
   //1.初始化JSON字符串
    String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";

    //2.创建ObjectMapper对象
    ObjectMapper mapper = new ObjectMapper();
    //3.转换为Java对象 Person对象
    Person person = mapper.readValue(json, Person.class);
	//输出打印一下
    System.out.println(person);
}

运行测试方法,控制台输出:

Person{name='张三', age=23, gender='男'}

输出了一个Person对象。


到这对JSON的应该有了基本理解。这时候就需要一个练习,加深JSON应用了,推荐看下篇博文。

推荐阅读:
【JavaWeb】AJAX和JSON案例:用户名已注册.

欢迎点赞评论,指出不足,笔者由衷感谢哦!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值