近期的学习与大作业中,发现了Json的重要性,借此机会记录下来。
Json 是一种轻量级的数据交换的格式类型,是JavaScript对象表示法,应用广泛。对于后端对象来说,Json 就是一个字符串,比如:
“ hello ” : 这是字符串 hello : 这是对象
以键值对的形式,key 和 value 都需要用双引号引起来,中间用冒号分隔。
{"name":"张三","age":3,"sex":"男"}首先我们测试一段 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 用中括号括起来。
[ {"name":"张三","age":3,"sex":"男"}, {"name":"张三2","age":23,"sex":"男"} ]前后端分离时代:
后端部署后端,提供接口,提供数据前端独立部署,负责渲染后端传来的数据这里用我最近做的安卓应用为例。 使用的数据接口来源于聚合数据。
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数据进行对应)工具 : 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; }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. 安全问题
JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。这使得XML在程序判读上需要比较多的功夫。主要的原因在于XML的设计理念与JSON不同。XML利用标记语言的特性提供了绝佳的延展性(如XPath),在数据存储,扩展及高级检索方面具备对JSON的优势,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。