JSON-初识+解析

1. JSON

1.1 什么是JSON

JSON(JavaScript Object Notation, JS 对象标记):是一种轻量级的数据交换格式。JSON使用JavaScript 语法来描述数据对象,采用完全独立于语言的文本格式,易于存储和交换。

JSON 的网络媒体类型是 application/json

1.2 JSON使用范围

JSON基于JavaScript编写数据对象,因此,任何JavaScript支持的类型都可以通过JSON来表示。

JSON可以用于通过网络连接序列化和阐述结构化数据。

用于在Web应用程序之间传输数据。

1.3 JSON特点

  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写shiyo,同时也易于机器解析和生成,并有效地提升网络传输效率。

1.4 JSON格式

JSON语法是JavaScript语法的子集。

  • 数据使用key:value对表示
  • 数据间用逗号分隔
  • 使用大括号保存对象
  • 使用方括号保存数组,数组中包含多个对象

1.5 JSON示例

JSON数据的格式为:name:value

  • JSON的key需要加引号,JavaScript不需要引号。
  • JSON的value需要加引号,且为字符串
{ "name" : "JOEL" }
{ "fly" : false }
{ "money" : null }

1.6 JSON使用

使用场景:在后台应用程序中将响应数据封装为JSON格式,传到前台页面之后,需要将JSON格式转换为JavaScript对象,然后再页面中使用该数据。

2. JSON/JavaScript

在JavaScript中定义一个简答的对象:

<script type="text/javascript">
    var user = {
        name:"张三",
        age:22,
        sex:"男"
    }
</script>

2.1 JSON与JS的区别

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

2.2 JS转为JSON

要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

// 将JavaScript对象转为JSON
var json = JSON.stringify(user);
document.write(json);

🔵 输出:{“name”:“张三”,“age”:22,“sex”:“男”}

2.3 JSON转为JS

要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

// 将JSON对象转为JavaScript
var js = JSON.parse(json);
document.write(js.name, js.age, js.sex);

🔵 输出:张三22男

2.4 JSON接口

JSON与JavaScript对象之间相互转换的方法定义在JSON接口中。

interface JSON {
    /**
     * 将JSON对象转为JavaScript
     * @param JSON对象
     * @param reviver转换结果的函数。该函数将为对象的每个成员调用。
     * 如果成员包含嵌套对象,则嵌套对象在父对象之前进行转换。
     */
    parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;
    /**
     * 将JavaScript对象转为JSON
     * @param value要转换的JavaScript值要转换的JavaScript值,通常是一个对象或数组。
     * @param replacer转换结果的函数。
     * @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。
     */
    stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;
    /**
     * 将JavaScript对象转为JSON
     * @param value要转换的JavaScript值,通常是一个对象或数组。
     * @param 一个字符串和数字的数组,作为一个被批准的列表,用于选择将被字符串化的对象属性。
     * @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。
     */
    stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;
}

3. JSON解析工具

JSON 的解析工具:Jackson、Fastjson

3.1 Jackson

3.1.1 什么是Jackson

Jackson: 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。

3.1.2 Jackson核心

Jackson包含三部分:jackson-core、jackson-annotations、jackson-databind。

jackson-core: 核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json;

jackson-annotations: 注解包,提供标准注解功能;

jackson-databind: 数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

3.1.3 ObjectMapper

Jackson 最常用的 API 就是基于"对象绑定" 的 ObjectMapper。

ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。

ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。

writeValueAsString方法如下:

public String writeValueAsString(Object value) throws JsonProcessingException {
    SegmentedStringWriter sw = new SegmentedStringWriter(this._jsonFactory._getBufferRecycler());

    try {
        this._writeValueAndClose(this.createGenerator((Writer)sw), value);
    } catch (JsonProcessingException var4) {
        throw var4;
    } catch (IOException var5) {
        throw JsonMappingException.fromUnexpectedIOE(var5);
    }

    return sw.getAndClear();
}

3.2 Fastjson

3.2.1 什么是Fastjson

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

特点:速度快、使用广泛、测试完备、使用简单、功能完备。

3.2.2 Fastjson类

FastJson对于json格式字符串的解析主要用到了三个类:JSON、JSONObject、JSONArray。

  • JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
  • JSONObject:fastJson提供的json对象。
  • JSONArray:fastJson提供json数组对象。

image-20211014233851646

public abstract class JSON implements JSONStreamAware, JSONAware {...}
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {...}
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {...}

4. SpringMVC-JSON

4.1 Jackson方式

4.1.1 导入依赖

pom.xml导入jackson-databind依赖。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

4.1.2 编写POJO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String password;
}

4.1.3 输出对象

4.1.3.1 编写Controller

解析步骤:

1️⃣ Step1:实例化ObjectMapper对象

2️⃣ Step2:实例化User对象

3️⃣ Step3:通过writeValueAsString方法将POJO解析为JOSN格式,返回String

@RestController
public class UserController {

    //@ResponseBody
    @RequestMapping(value = "/Json")
    public String test() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User(1, "张三", "123123");
        String str = objectMapper.writeValueAsString(user);
        return str;
    }
}

@RestController:这也是一种Controller,该注解表示不需要再走视图(View)

解释:之前Controller中的方法返回的都是String类型的视图名,而现在我们需要返回JSON,为了不修改视图解析器,我们可以将该注解作用在类上,这样就不再经过视图。

🌈 URL为@RequestMapping的value。

@ResponseBody:指示方法返回值的注释应该绑定到web响应主体上。支持带注释的处理程序方法。

该注解实现的就是不用再走视图。

🌈 @RestController注解实际上就是被@ResponseBody标注的!

4.1.3.1 测试输出

image-20211014223248091

4.1.4 输出集合

4.1.4.1 编写Controller
@RestController
public class UserController {

    @RequestMapping(value = "/JsonList")
    public String test2() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User(1, "张三", "123123");
        User user2 = new User(1, "李四", "123123");
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user2);
        String str = objectMapper.writeValueAsString(list);
        return str;
    }
}
4.1.4.2 测试输出

image-20211014223749798

4.1.5 输出日期

4.1.5.1 编写UTILS

思路:

1️⃣ Step1:实例化ObjectMapper对象

2️⃣ Step2:实例化SimpleDateFormat对象,传入日期格式

3️⃣ Step3:通过setDateFormat方法,为ObjectMapper对象指定格式

4️⃣ Step4:通过writeValueAsString方法将日期转为JSON数据并输出字符串

5️⃣ Step5:重载次方法,指定一个默认的日期格式

public class JsonDateUtils {

    public static String getJsonDate(Object object){
        return getJsonDate(object, "yyyy-MM-dd HH:mm:ss")
    }

    /**
     * 格式化日期
     * @param object 日期
     * @param dateFormat 自定义日期格式
     * @return 返回日期字符串
     */
    public static String getJsonDate(Object object, String dateFormat) {

        ObjectMapper objectMapper = new ObjectMapper();
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        objectMapper.setDateFormat(sdf);
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
4.1.5.2 编写Conreoller
@RestController
public class UserController {

    @RequestMapping("/JsonDate")
    public String getDate(){
        return JsonDateUtils.getJsonDate(new Date());
    }
}
4.1.5.3 测试输出

image-20211014230906168

4.2 Fastjson

4.2.1 导入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

4.2.2 编写测试类

public class FastJsonTest {

    public static void main(String[] args) {
        User user1 = new User(1,"张三","123123");
        User user2 = new User(2,"李四","123123");
        User user3 = new User(3,"王五","123123");
        List<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
    }
}
4.2.3.1 JAVA转JSON
System.out.println("===Java对象 转为 JSON字符串===");
System.out.println("userJSON: " + JSON.toJSONString(user1));
System.out.println("listJSON: " + JSON.toJSONString(list));

/*
输出:
===Java对象 转为 JSON字符串===
userJSON: {"id":1,"name":"张三","password":"123123"}
listJSON: [{"id":1,"name":"张三","password":"123123"},{"id":2,"name":"李四","password":"123123"},{"id":3,"name":"王五","password":"123123"}]
*/
4.2.3.2 JSON转JAVA
System.out.println("===JSON字符串 转为 Java对象===");
System.out.println("user: " + JSON.parseObject(JSON.toJSONString(user1), User.class));
System.out.println("list: " + JSON.parseObject(JSON.toJSONString(list), List.class));

/*
输出:
===JSON字符串 转为 Java对象===
user: User(id=1, name=张三, password=123123)
list: [{"password":"123123","name":"张三","id":1}, {"password":"123123","name":"李四","id":2}, {"password":"123123","name":"王五","id":3}]
*/

4.2.3 输出日期

利用Fastjson实现日期的输出,输出效果很上面用Jackson一致。

public static String getDate(Object object){
    return getDate(object, JSON.DEFFAULT_DATE_FORMAT);
}

public static String getDate(Object object, String format){
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
    return JSON.toJSONString(simpleDateFormat.format(object));
}

@Test
public void test(){
    System.out.println(getDate(new Date()));
}

image-20211015001443931

5. 写在最后

JSON常用的解析器还有Goole的gson,但是速度较慢。

 


❤️ END ❤️
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值