JSON 广度学习

前言

近期的学习与大作业中,发现了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更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值