JSON

网络数据传输

计算机网络通信本质就是相互传输数据,而传输数据就涉及到数据存储格式。所谓数据存储格式就是将数据先按照一定的格式存储,然后再传输到网络的另一端。另一端接收到数据后,就可以按照存储的格式将数据解析出来。

image-20210927104332263

常见的两种网络数据存储格式

  • XML 格式
  • JSON 格式

XML 格式

曾经有一段时间,XML 是互联网上传输结构化数据的事实标准;Web 服务的第一次浪潮很大程度上都是建立在XML之上的,突出的特点是服务器与服务器间通信。但是业界一直不乏质疑 XML 的声音。不少人认为 XML 过于烦琐、冗长。

举例:

<?xml version="1.0" encoding=“UTF-8"?>
<books>
     <book>
	<isbn>1</isbn>
	<title>Title of 1</title>
	<author>Author of 1</author>
     </book>
     <book>
	<isbn>3</isbn>
	<title>Title of 3</title>
	<author>Author of 3</author>
     </book>
</books>

XML 格式存储数据的特点是跨编程语言、数据传输效率低(已过时)

JSON 格式

  • JSON 是 JavaScript的一个严格的子集,利用了 JavaScript 中的一些模式来表示结构化数据。JSON 是在 JavaScript 中读写结构化数据的更好的方式

  • JSON 是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但JSON 并不从属于JavaScript

举例:

[
   {
      isbn:1,
      title:“Title of 1”,
      author:“Author of 1”
   },
   {
       isbn:3,
      title:“Title of 3”,
      author:“Author of 3”
   }
]

JSON 格式存储数据的特点是跨编程语言、数据传输效率高(主流)

JSON 语法

JSON 的语法可以表示三种数据类型

  • 简单值:使用与JS相同的语法,可以在 JSON 中表示字符串、数值、布尔值和null(JSON不支持JS中特殊值undefined)
  • 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对;每个键值对中的值可以是简单值,也可以是复杂数据类型的值
  • 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是简单值、对象或数组

简单值

JSON 简单值等价于 Java 的基本数据类型

举例:

5 # 数值 
true # 布尔值
"hello,world!" # 字符串
null # 空值
  • JSON字符串与 JS 字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误)
  • 布尔值和 null 也是有效的 JSON 形式
  • 在实际应用中,JSON 更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分

JSON 对象

JSON 对象等价于 Java 对象,使用大括号 { } 表示对象

举例:

{
     name:“张三”,
     age: 24,
     gender:“男”
}

与 JS 的对象字面量相比,JSON 对象有三个地方不一样

  • 没有申明变量(JSON中没有变量的概念)
  • 没有末尾的分号
  • 对象可以嵌套对象

对象嵌套举例:

{
       "name" : "张三",
       "age" : 29,
       "school": {
           "name": "成都一中",
           "location": "人民中路三段38号"
        }
 }

对象属性值可以是简单值,也可以是对象

JSON 数组

JSON 数组等价于 Java 数组,使用 []表示数组

举例:

[25,"Hi", 14.5,  true ]

JSON数组采用的是JS中的数组字面量形式

  • JSON 数组没有变量和分号
  • 把数组和对象结合起来,可以构成更复杂的数据集合

复杂数组举例:

[ 
    { 
         "title": "Professional JavaScript", 
         "authors": [ 
             "Nicholas C. Zakas" 
         ], 
         “edition”: 3, 
         “year”: 2011 
    }, 
    { 
         "title": "Professional JavaScript", 
         "authors": [ 
              "Nicholas C. Zakas" 
         ], 
         “edition”: 2, 
         “year”: 2009 
    }
]

JSON 与 Java 对象相互转换

Java:

public class Person {
       private String name;
       private int age;
       private String gender;
       private Contact contact;
}
public class Contact {
       private String phone;
       private String email;
       private String qq;
       private String msn;
}

JSON:

{
    name:“张三”,
    age: 24,
    gender:“男”,
    contact:{
        phone:“13541335229”,
        email:zhangsan@qq.com,
        qq:26842234
        msn:zhangsan2021
     }
}

JSON 解析与序列化

JSON 解析与序列化类似于 Java 的序列化和反序列化

JSON 之所以流行,拥有与 JS 类似的语法并不是全部原因。更重要的一个原因是,可以把JSON 数据结构解析为有用的 JS 对象(与 XML 数据结构要解析成 DOM 文档而且从中提取数据极为麻烦相比,JSON 可以解析为 JS 对象的优势极其明显)

JS中包含一个全局对象JSON,该对象有两个方法

  • stringify( ) :用于把 JS 对象序列化为 JSON 字符串
  • parse( ):用于把 JSON 字符串解析为原生 JS 值(反序列化)

举例:

var book = {  
                title: "Professional JavaScript", 
                authors: [ 
                   "Nicholas C. Zakas" 
                ], 
                edition: 3, 
                year: 2011 
 }; 
var jsonText     =  JSON.stringify(book);   //序列化对象
var bookCopy =   JSON.parse(jsonText); //解析对象(反序列化)

注意:序列化时值为 undefined 的任何属性会被忽略,结果中最终都是有效数据。如果传给 JSON.parse() 的字符串不是有效的JSON 数据,该方法会抛出错误

posted @ 2021-10-15 18:34  追こするれい的人  阅读(32)  评论(0编辑  收藏  举报