JSON学习笔记

news2024/7/31 1:55:17
♥课程链接: 【狂神说Java】一小时掌握JSON_哔哩哔哩_bilibili
配套的当然还要学习ajax
不管是前端后端,感觉这部分内容是必须的,不然真的做项目的时候云里雾里。
总体json的内容不多,具体就:
1. 列表、对象等语法格式
2. json和js对象的相互转换:
JSON.parse() : JSON → js对象
JSON.stringify(): js对象→JSON
3. 在contoller层结合一些工具使用

一、Json

1.1 什么是Json

JSON (JavaScript Object Notation, JS对象标记) 是一种轻量级的数据交换格式。

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

作用:JSON:前后端分离中,数据交互的王者!

1.2 语法格式

  • 对象表示为键值对

  • 数据由逗号分隔(最后一个数据后边没有逗号)

  • 花括号保存对象

  • 方括号保存数组

JSON键值对是用来保存JS对象的一种方式,和JS对象的写法大同小异,用双引号""包裹键名,用冒号: 分割键与值,如下所示

{"name": "Boat"}
{"age": "18"}
{"sex": "女"}

1.3 JSON与JS对象

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

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

JSON和JS对象互换

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

var obj = JSON.parse({"a":"Hello", "b":"world"}); //结果是{a: 'Hello', b: 'world'}

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

var json = JSON.stringify({a: 'Hello', b: 'world'}); //结果是{"a":"Hello", "b":"world"}

可以通过console.log(obj) 和console.log(json) 在前端看一下区别:

所以只要后端 返回这样的字符串,通过JSON.parse()方法 就可以变成一个对象

1.4 结合后端食用

1.4.1 jackson 和 @ResponseBody注解

在controller层,写相应的处理方法,处理其返回值的时候,需要考虑一下,如果正常返回,它会走视图解析器,而json需要返回的是一个字符串,市面上很多第三方jar包可以实现这个功能,例如jackson

  1. 需要先在pom中加入jackson的依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>
  1. 在controller里的方法前加入注解 @ResponseBody,就可以实现了

@ResponseBody@RequestBody 的区别:
@ResponseBody: 可以将服务器端返回的对象,转换为json对象响应回去(表示该方法的返回的结果直接写入 HTTP 响应正文中,一般在异步获取数据时使用;)
在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。例如,异步获取json数据,加上@Responsebody注解后,就会直接返回json数据。
@RequestBody :一般用来负责接收前台的json数据,把json数据自动封装到pojo中,在Ajax里尝试(将 HTTP 求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。)
-----------------
参考: 详述 @ResponseBody 和 @RequestBody 注解的区别_CG国斌的博客-CSDN博客_**@requestbody和@responsebody的区别?**

1.4.2 基本controller操作,将返回的对象转为json

controller中的代码实现如下:

@RequestMapper("/json1") 
@ResponseBody //该注解可以将服务器端返回的对象,转换成json相应过去
public String json1(){
    // 需要一个jackson的对象映射器,就是一个类,使用它可以直接将对象转换为json字符串
    ObjectMapper mapper = new ObjectMapper(); //来自jackson
    
    // 创建一个对象
    User user = new User(name: "小船", age: 18, sex:"女");
    
    //将Java对象转换为json对象
    String str = mapper.writeValueAsString(user);

    return str; //由于使用了@ResponseBody注解,这里会将str 以json格式的字符串返回,十分方便
}

可以成功运行出来,但是汉字会乱码,

1.4.3 乱码处理

解决办法:给@RequestMapping加一个produces属性,设置编码格式为UTF-8,以及它的返回值类型,顺带精简一下代码:

@RequestMapper("/json1", produces = "application/json;charset=utf-8") //produces:指定相应体返回类型和编码
@ResponseBody 
public String json1(){

    User user = new User(name: "小船", age: 18, sex:"女");
    
    return new ObjectMapper().writeValueAsString(user);

}

一劳永逸的办法:在spring中进行配置,但是因为不同时候用的框架也不一样,所以这里就先不写了,放上狂神课里,用springmvc时候的解决办法

1.4.4 升级版controller中的代码(用list传递多个对象)

升级版controller中的代码(用list传递多个对象):

@RequestMapper("/json3") 
@ResponseBody //该注解可以将服务器端返回的对象,转换成json相应过去
public String json3(){
    List<User> list = new ArrayList<>();

    User user1 = new User(name: "小船1", age: 18, sex:"女");
    User user2 = new User(name: "小船2", age: 18, sex:"女");
    User user3 = new User(name: "小船3", age: 18, sex:"女");
    User user4 = new User(name: "小船4", age: 18, sex:"女");
    
    list.add(user1);
    list.add(user2);
    list.add(user3);
    list.add(user4);

    return new ObjectMapper().writeValueAsString(list); //直接传递list就行
}

返回的结果就是:

[{"name": "小船1", "age": 18, "sex":"女"},{"name": "小船2", "age": 18, "sex":"女"},{"name": "小船3"," age": 18, "sex":"女"},{"name": "小船4", "age": 18, "sex":"女"}]

可以看出,json的列表是[],不同对象用{}, 不同对象间用逗号分开,最后一个不能加逗号

1.4.5 json格式化工具

json格式化工具:JSON 在线解析 | 菜鸟工具 (runoob.com)

1.4.6 传递时间

传递时间,需要import 一下 Data, 注意是import java.util.Date

Cotroller层代码如下:

@RequestMapper("/json5") 
@ResponseBody 
public String json5(){
    // 传递data的时候,还是需要考虑格式问题的,不然传给json就是个时间戳
    ObjectMapper mapper = new ObjectMapper(); 
    // 1. 关闭时间戳
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, state:false);
    // 2. 时间格式化,自定时间格式对象:
    SimpleDateFormat sdf = new SimpleDateFormat(pattern:"yyyy-MM-dd HH:mm:ss");
    // 3. 让mapper指定时间日期格式为simleDateFormat
    mapper.setDateFormat(sdf);
    
    // 写一个日期对象
    Date date = new Date();
    
    return new ObjectMapper().writeValueAsString(date);

}

可以把格式化时间的代码,封装成一个工具类,也可以用不同框架的时候,全局配置时间,这儿的,我也就只放狂神课堂的截图了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++复习笔记9

STL中的list的部分实现&#xff0c;包括了迭代器的整体实现思想和空间配置器的部分功能。 main.cpp //STL中的list是一个双向循环链表 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include"mymemory.h" using namespace std;class String { public:…

Python 数据可视化的 3 大步骤,你知道吗?

Python实现可视化的三个步骤&#xff1a; 确定问题&#xff0c;选择图形转换数据&#xff0c;应用函数参数设置&#xff0c;一目了然 1、首先&#xff0c;要知道我们用哪些库来画图? matplotlib Python中最基本的作图库就是matplotlib&#xff0c;是一个最基础的Python可视…

上海亚商投顾:沪指震荡上行 大消费板块全线走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日震荡反弹&#xff0c;沪指全天低开高走&#xff0c;深成指、创业板指均涨超1%。工程机械板块集体大涨&a…

nodejs学习笔记1.2

1、made \\ 中括号代表可选参数 、、、、 使用path模块处理路径拼接问题 、、、、 将/进行转义/ 、、、、 http模块 web服务器 、、、 创建最基本的web服务器 我表示醉了&#xff0c;之前都没有学到&#xff0c;难怪我学得糊里糊涂 req客户端 res…

00---C++入门

1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 2. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进…

简单易用的以太网IO控制卡:C#读写测试

今天&#xff0c;正运动小助手给大家分享一下运动控制卡之ECIO系列IO卡的用法&#xff0c;C#语言进行ECI IO卡的开发以及测试多个IO读写的交互速度。 一、ECI0032/ECI0064 IO卡的硬件介绍 1.功能介绍 ECI0032/ECI0064等ECI0系列运动控制卡支持以太网、RS232通讯接口和电脑相…

A-Ops性能火焰图——适用于云原生的全栈持续性能监测工具

对于开发及运维人员来讲&#xff0c;火焰图是一个经典的定位性能问题的方法。利用火焰图可以可视化系统资源(cpu占用、内存占用、调度、IO等)的占用情况&#xff0c;从而帮助技术人员快速定位资源异常使用的代码级根因&#xff0c;或者观察潜在性能劣化趋势&#xff0c;进而优化…

2023最新简历模板免费下载

下面分享5个简历模板网站&#xff0c;免费下载&#xff0c;建议收藏&#xff01; 2023用最漂亮的简历模板&#xff0c;让面试官眼前一亮。 1、菜鸟图库 个人简历模板|WORD文档模板免费下载 - 菜鸟图库 菜鸟图库除了有超多设计类素材之外&#xff0c;还有很多办公类素材&#…

Multimap运用

Multimap概念:Multimap的特点其实就是可以包含有几个重复key的value值&#xff0c;你可以put进多个不同的value&#xff0c;但是key相同&#xff0c;但是又不是让后面的覆盖前面的内容.业务场景:当你需要构造像Map<K,List<V>> 或者Map(K,Set<V>)这样比较复杂…

MongoDB--》基本常用命令使用

目录 数据库操作命令 选择和创建数据库 数据库的删除 集合操作命令 集合的显示创建 集合的隐式创建 集合的删除 文档基本的CRUD&#xff08;增删改查&#xff09; 文档的插入 文档的基本查询 文档的更新 删除文档 数据库操作命令 数据库常用的操作命令如下&#x…

docker基础和使用(一)

Docker 入门篇 文章目录Docker 入门篇一、docker简介1.1、docker说明&#xff1a;1.2、docker镜像说明&#xff1a;1.2.1、UnionFS&#xff08;联合文件系统&#xff09;1.2.2、docker镜像分成的好处1.2.3、docker平台架构图二、docker的常用命令1.1、手册查询1.2、docker启停和…

知识图谱业务落地技术推荐之图数据库汇总

0.图数据库排名 链接:https://db-engines.com/en/ranking/graph+dbms 0.1简要分析(各种图数据库属性) Neo4j(主流) 历史悠久且

备考蓝桥杯【快速排序和归并排序】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

【王道数据结构】第八章 | 排序

目录 8.1. 排序的基本概念 8.2. 插入排序 8.2.1. 直接插入排序 8.2.2. 折半插入排序 8.2.3. 希尔排序 8.3. 交换排序 8.3.1. 冒泡排序 8.3.2. 快速排序 8.4. 选择排序 8.4.1. 简单选择排序 8.4.2. 堆排序 8.5. 归并排序和基数排序 8.5.2. 基数排序 8.1. 排序的基本概念 排…

3-track网络预测蛋白质结构和相互作用

目录引言网络架构发展直接生成蛋白-蛋白复合物DeepMind在最近的CASP14上展示了非常准确的预测。作者探索了融合相关思想的网络架构&#xff0c;并通过对一维序列级、二维距离图级&#xff08;distance map&#xff09;和三维坐标级&#xff08;coordinate&#xff09;的信息依次…

机械设备管理软件如何选择?机械设备管理软件哪家好?

随着信息化技术的进步与智能制造的发展趋势&#xff0c;很多机械设备制造企业也在一直探寻适合自己的数字化管理转型之路&#xff0c;而企业上ERP管理软件又是实现数字化管理的前提&#xff0c;机械设备管理软件对于企业来说就是关键一环。机械设备管理软件如何选择&#xff1f…

IPV4地址的原理和配置

第三章&#xff1a;IP地址的配置 IPv4&#xff08;Internet Protocol Version 4&#xff09;协议族是TCP/IP协议族中最为核心的协议族。它工作在TCP/IP协议栈的网络层&#xff0c;该层与OSI参考模型的网络层相对应。网络层提供了无连接数据传输服务&#xff0c;即网络在发送分…

【GD32F427开发板试用】7. 移植LVGL到GD32F427V

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

TypeScript快速入门———(一)TypeScript 介绍以及初体验

文章目录1. TypeScript 介绍1.1 TypeScript 是什么1.2 TypeScript 为什么要为 JS 添加类型支持&#xff1f;1.3 TypeScript 相比 JS 的优势2. TypeScript 初体验2.1 安装编译 TS 的工具包2.2 编译并运行 TS 代码2.3 简化运行 TS 的步骤1. TypeScript 介绍 1.1 TypeScript 是什…

[python入门㊺] - 异常中的finally

目录 ❤ finally的作用 ❤ try、except、finally的执行顺序是什么 ❤ 案列 finally 中不带return finally中有return ❤ finally的作用 finally内的代码不管有无异常发生&#xff0c;都会执行。具体来说&#xff1a; 无论是否发生了异常&#xff0c;一定会执行 fi…