1.JSON
1.1 web 1.0时代
- 早期网站:登录若失败,需刷新整个页面,才能重新登录。不点击提交按钮,无法验证账户密码是否错误。
1.2 web 2.0时代
- 页面往往是局部刷新而不刷新整个网页,来实现页面实施更新
- 场景:注册账号时,仅仅是输入手机号,就提示是否注册过
- 重要特征是AJAX
1.3 JSON介绍
- JSON:(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。易于人阅读和编写。同时也易于机器解析和生成。
- 在当前前后端分离的大环境下,数据交互非常频繁,JSON也异常中要。
1.4 JSON 语法
-
JSON是一个标记符的序列。
-
JSON是一个序列化的对象或数组。
-
对象表示为键值对
-
数据由逗号分割
-
花括号保存对象
-
方括号保存数组
1.4.1 JSON的值
- 值可以是对象、数组、数字、字符串或者三个字面量(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
- JSON键值对是用来保存JS对象的一种方式,和js对象写法类似,键/值对中键在前用双引号包括,使用:冒号分割,之后跟值。
{``"name"``: ``"John Doe"``, ``"age"``: 18, ``"address"``: {``"country"` `: ``"china"``, ``"zip-code"``: ``"10000"``}}
- 数组是由方括号括起来的一组值构成,如:[3, 1, 4, 1, 5, 9, 2, 6]
- 一些合法的JSON的实例:
{``"a"``: 1, ``"b"``: [1, 2, 3]} [1, 2, ``"3"``, {``"a"``: 4}] 3.14 "plain_text"
1.5 JSON 与 JS 对象的关系
- JSON (括号最外层带引号)是 JS 对象(括号最外层不带引号)的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串
var` `obj = {a: ``'Hello'``, b: ``'World'``}; ``//这是一个对象,注意键名也是可以使用引号包裹的 var` `json = ``'{"a": "Hello", "b": "World"}'``; ``//这是一个 JSON 字符串,本质是一个字符串
1.5.1 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"}'
1.6 常用类型
-
JS语言中一切皆对象
-
JS任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
-
对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, …} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
-
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
-
在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串
-
表示对象:对象是一个无序的“‘名称/值’对”集合。一个对象以{左括号开始,}右括号结束。每个“名称”后跟一个:冒号;“‘名称/值’ 对”之间使用,逗号分隔。
{``"firstName"``: ``"Brett"``, ``"lastName"``: ``"McLaughlin"``}
-
表示数组:和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。如何用括号将记录组合成一个值
{
"people":[
{"firstName": "Brett",
“lastName”:“McLaughlin”},
{"firstName":"Jason",
“lastName”:“Hunter”}
]“}
- 在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓
1.8 JSON和XML的比较
-
JSON:前端交互数据;XML:配置环境
-
可读性:JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式。
-
扩展性:XML天生有很好的扩展性,JSON当然也有弱于XML。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。
1.9 开发步骤
- 导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.5</version>
</dependency>
- 编写实体类
import com.alibaba.fastjson.annotation.JSONField;
public class People {
private int id;
private String name;
private String password;
private String email;
//@JSONField(format = "yyyy-MM-dd HH:mm:ss") //使用fastjson注解,可以指定日期格式,在用fastjson将java对象转换为json字符串时,不用指定日期格式
private Date birthday;
public People() {
}
public People(int id, String name, String password, String email, Date birthday) {
this.id = id;
this.name = name;
this.password = password;
this.email = email;
this.birthday = birthday;
}
- 封装JsonUtil类
public class JsonUtil {
public static String getStringByJackson(Object object){
String DateFormat = "yyyy-MM-dd HH:mm:ss";
String jsonObject = JsonUtil.getStringByJackson(object,DateFormat);
return jsonObject;
}
public static String getStringByJackson(Object object,String DateFormat) {
//需要一个jackson对象映射器,将java对象转换为json字符串
ObjectMapper objectMapper = new ObjectMapper();
//时间格式化问题
//如在实体类中用了注解,则不用上诉代码
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//设置objectMapper的时间格式
SimpleDateFormat sdft = new SimpleDateFormat(DateFormat);
objectMapper.setDateFormat(sdft);
String jsonObject = null;
try {
jsonObject = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonObject;
}
//fastjson方式1
public static String getStringByfastjson1(Object object) {
//解决日期值返回时间戳问题,设置不返回时间戳
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
String userJson = JSON.toJSONString(object, SerializerFeature.WriteDateUseDateFormat);
return userJson;
}
//fastjson方式2
public static String getStringByfastjson2(Object object) {
//解决日期值返回时间戳问题,设置不返回时间戳
//JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
String userJson=JSON.toJSONStringWithDateFormat(object,JSON.DEFFAULT_DATE_FORMAT); //, SerializerFeature.WriteDateUseDateFormat
//如在实体类中用了注解,则不用上诉代码
/*String userJson = JSON.toJSONString(object);*/
return userJson;
}
}
- 编写控制器
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
People user = new People(1,"张三","123456","1234568789@123.com",new Timestamp(System.currentTimeMillis()));
String stringByfastjson1 = JsonUtil.getStringByJackson(user);
resp.getWriter().write(stringByfastjson1);
String stringByfastjson2 = JsonUtil.getStringByfastjson1(user);
resp.getWriter().write(stringByfastjson2);
String stringByfastjson3 = JsonUtil.getStringByfastjson2(user);
resp.getWriter().write(stringByfastjson3);
}
- 注册控制器
<servlet>
<servlet-name>UserController</servlet-name>
<servlet-class>com.zk.controller.UserController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserController</servlet-name>
<url-pattern>/uc</url-pattern>
</servlet-mapping>
- @ResponseBody //将服务器端返回的对象转换为json对象响应回去,@RequestBody,接收前台的jiso数据,把json数据封装到pojo中,在AJAX异步获取数据时会使用到。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/123947.html