前言
近期的学习与大作业中,发现了Json的重要性,借此机会记录下来。
什么是Json?
Json 是一种轻量级的数据交换的格式类型,是JavaScript对象表示法,应用广泛。对于后端对象来说,Json 就是一个字符串,比如:
“ hello ” : 这是字符串
hello : 这是对象
Json长什么样?
以键值对的形式,key 和 value 都需要用双引号引起来,中间用冒号分隔。
{"name":"张三","age":3,"sex":"男"}
Json和对象的差别
首先我们测试一段 JavaScript的代码
<script type="text/javascript">
var user = {
name : "张三",
age : 3,
sex : "男"
};
//将js对象转化成json
var json = JSON.stringify(user);
console.log(json);
console.log(user);
</script>
结果如下:
通过浏览器控制台显示:
第一行是一 Json
第二行是 对象Object ,是可以展开的
二者的差别: 在对象中,key 没有双引号
Json数组
Json 数组给各个 Json 用中括号括起来。
[
{"name":"张三","age":3,"sex":"男"},
{"name":"张三2","age":23,"sex":"男"}
]
Json 的作用
前后端分离时代:
- 后端部署后端,提供接口,提供数据
- 前端独立部署,负责渲染后端传来的数据
那问题来了:前后端如何进行交互,数据的传输?
这里用我最近做的安卓应用为例。
使用的数据接口来源于聚合数据。
Json 返回示例:
{
"error_code": 0, /*返回码*/
"reason": "请求成功!",
"result": [
{
"day": 1, /*日*/
"des": "1907年11月1日 电影导演吴永刚诞生 吴永刚,1907年11月1日生于江苏吴县。1932年后参加影片《三个摩登女性》、《母性之光》的拍摄工作。1934年在联华影片公司编导处女作《神女》,一举成名,...", /*描述*/
"id": 9000, /*事件ID*/
"lunar": "丁未年九月廿六",
"month": 11, /*月份*/
"pic": "", /*图片*/
"title": "电影导演吴永刚诞生", /*事件标题*/
"year": 1907 /*年份*/
},
{
"day": 1,
"des": "1902年11月1日 挪威作家格里格诞生 格里格,1902年11月1日生于卑尔根。挪威作家。 青年时代在奥斯陆和牛津求学,好旅行。1924年出版描写海员生活的小说《航船在前进》。1926年至1927年在...",
"id": 9010,
"lunar": "壬寅年十月初二",
"month": 11,
"pic": "",
"title": "挪威作家格里格诞生",
"year": 1902
},
{
"day": 1,
"des": "1911年11月1日,清廷宣布解散皇族内阁,任命袁世凯为内阁总理大臣,要他赶快从前线回京,筹组“责任内阁”。11月13日,袁世凯抵达北京,16日组织新内阁,以梁郭彦为外务大臣,赵秉钧为民政大臣,...",
"id": 3577,
"lunar": "辛亥年九月十一",
"month": 11,
"pic": "",
"title": "袁世凯出任清朝内阁总理大臣",
"year": 1911
}
]
}
那么从接口获得的数据应该怎么在我的 App 应用上得到应用呢?
- 生成我们的 JavaBean(主要是属性,其余是get set 方法)
public class HistoryBean implements Serializable {
private String reason;
private int error_code;
private List<ResultBean> result;
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
public List<ResultBean> getResult() {
return result;
}
public void setResult(List<ResultBean> result) {
this.result = result;
}
public static class ResultBean implements Serializable{
/**
* _id : 16530420
* title : 奥利弗·克伦威尔解散英国国会
* pic : http://juheimg.oss-cn-hangzhou.aliyuncs.com/toh/201004/18/FA235154714.jpg
* year : 1653
* month : 4
* day : 20
* des : 在367年前的今天,1653年4月20日 (农历三月廿三),奥利弗·克伦威尔解散英国国会。
* lunar : 癸巳年三月廿三
*/
private String _id;
private String title;
private String pic;
private int year;
private int month;
private int day;
private String des;
private String lunar;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getLunar() {
return lunar;
}
public void setLunar(String lunar) {
this.lunar = lunar;
}
}
}
- 其余操作(Bean只是与json数据进行对应)
Json与对象之间的转换
工具 : gson、Jackson 等等。
这里以 spingMVC 中使用Jackson为例
@RestController
public class UserController {
@RequestMapping(value = "/json1")
public String json1() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("张三1号", 3, "男");
//将我们的对象解析成为json格式
String str = mapper.writeValueAsString(user);
//由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
return str;
}
}
同理,处理Json数组:
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user1 = new User("张三1号", 3, "男");
User user2 = new User("张三2号", 3, "男");
User user3 = new User("张三3号", 3, "男");
User user4 = new User("张三4号", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//将我们的对象解析成为json格式
String str = mapper.writeValueAsString(list);
return str;
}
JSON 的其他应用领域
1. Web开发
JSON最开始被广泛的应用于WEB应用的开发。不过目前JSON使用在JavaScript、Java、Node.js应用的情况比较多,PHP、C#等开发的WEB应用主要还是使用XML。
2. NoSQL数据库
相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDB、CouchDB、RavenDB等。
- 举例
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
这种JSON格式也被Minecraft游戏用来当作的部分数据存储的格式:
[
{
"text": "This is the text",
"color": "dark_red",
"bold": "true",
"strikethough": "true",
"clickEvent":
{
"action": "open_url",
"value": "zh.wikipedia.org"
},
"hoverEvent":
{
"action": "show_text",
"value":
{
"extra": "something"
}
}
},
{
"translate": "item.dirt.name",
"color": "blue",
"italic": "true"
}
]
3. 安全问题
XML和JSON的区别
JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。这使得XML在程序判读上需要比较多的功夫。主要的原因在于XML的设计理念与JSON不同。XML利用标记语言的特性提供了绝佳的延展性(如XPath),在数据存储,扩展及高级检索方面具备对JSON的优势,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。