标记语言:JSON & YAML

JSON

JavaScript Object Notation(JavaScript 对象标记)

  1. 轻量级文本数据交换格式。
  2. 独立于编程语言。
  3. 使用 JavaScript 语法来描述数据对象(使用文本表示 JS 对象)。
  4. 具有自我描述性,易于理解。

1.1、JSON vs XML

JSON 和 XML 都用于接收 web 服务端的数据,通常使用字符串。

相同点

  • 可以被大多数编程语言使用。
  • 可通过 JavaScript 解析,可使用 AJAX 传输。
  • 具有自我描述性,具有层级结构。

JSON 的优点

  • 不需要结束标签,更加简短。
  • 支持数组类型。
  • 可使用现有的 JavaScript 对象解析,比 XML 更容易解析。
  • 对 AJAX 而言,传输速度更快、更简单
    • XML:获取 XML 文档,使用 XML DOM 来循环遍历文档,将数据解析并存储在变量中。
    • JSON:获取 JSON 字符串,解析 JSON 字符串。

1.2、语法

JSON 语法是 JavaScript 语法的子集。

语法

  • 数据用 K-V 键值对表示,数据之间用逗号分隔。
  • 大括号{}保存对象,中括号[]保存数组。

数据类型

  • 数字:整数或浮点数
  • 字符串:写在双引号中
  • 逻辑值:true 或 false
  • 对象:写在大括号{}
  • 数组:写在中括号[]
  • 空值:null

JSON 类型表示

  • 文件类型.json
  • MIME 类型application/json

1.2.1、JSON 对象

用大括号{}表示 JSON 对象,可包含多个 K-V 键值对。

  • Key 必须是字符串,Value 可以是任意 JSON 数据类型
  • Key 和 Value 中使用冒号:分割,多个 K-V 键值对之间使用逗号,分割。

访问 JSON 对象属性

通过点号.或中括号[]访问 JSON 对象

  • 获取、修改属性值

  • 使用 delete 关键字删除属性

    var person = {
        "name" : "jaywee",
        "age"  : "17",
        "hobby": ["java","music","basketball"]
    }
    // 获取
    var obj1 = person.name;
    var obj2 = person["name"];
    // 修改
    person.age = 10;
    person["age"] = 10;
    // 删除
    delete person.hobby;
    delete person[hobby];
    

1.2.2、JSON 数组

用中括号[]表示 JSON 数组

  • 数组元素可以是任意 JSON 数据类型
  • 元素之间使用逗号,分割。

访问 JSON 数组元素

通过[下标]访问数组(下标从 0 开始)

  • 获取、修改属性值

  • 使用 delete 关键字删除属性

    var person = {
        "name" : "jaywee",
        "age"  : "17",
        "hobby": ["java","music","basketball"]
    }
    // 获取
    var obj = person.hobby[0];
    // 修改
    person.hobby[0] = "spring";
    // 删除
    delete person.hobby[0];
    

1.3、JSON <-> JS 对象

在前后端开发中,通常使用 JSON 作为数据交换格式。

  • 发送端:对象 → 字符串(转换)
  • 接收端:字符串 → 对象(解析)

1.3.1、parse

JSON.parse():将 JSON 字符串转换为 JavaScript 对象

var obj = JSON.parse('{ "name":"jaywee", "age":"17" }');

1.3.1、stringify

JSON.stringify():将 JavaScript 对象转换为 JSON 字符串

// obj = { "name":"jaywee", "age":"17" }
var myJson = JSON.stringify(obj);

1.4、JSON 工具类

Java 中常用的 JSON 类库:

jackson、fastjson、Gson、 JSON-lib 等。

1.4.1、Jackson

pom 依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.4</version>
</dependency>

使用 ObjectMapper 对象处理 JSON 数据。

示例:转换 Java 对象。

ObjectMapper mapper = new ObjectMapper();
Object obj = new Object();
  • 对象 → 其它:重点关注 JSON 字符串

    // 转换为JSON字符串
    String objJson = mapper.writeValueAsString(obj);
    // 转换为字节流
    byte[] objBytes = mapper.writeValueAsBytes(obj);
    // 转换为文件
    mapper.writeValue(new File("obj.json"), user);
    
  • 解析

    // 读取字符串解析对象
    User obj1 = mapper.readValue(objJson, Object.class);
    // 读取字节流解析对象
    User obj2 = mapper.readValue(objBytes, Object.class);
    // 读取文件解析对象
    User obj3 = mapper.readValue(new File("obj.json"), Object.class);
    

1.4.2、Fastjson

阿里巴巴开发的 Java 类库,比 Jackson 更加方便。

pom 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

使用 JSON 类的静态方法。

  • 对象 → 其它:重点关注 JSON 字符串

    // 转换为字符串
    String objJson = JSON.toJSONString(obj);
    // 转换为字节流
    byte[] objBytes = JSON.toJSONBytes(obj);
    
  • 解析

    // 读取字符串解析对象
    Object obj1 = JSON.parse(objJson);
    // 读取字节流解析对象
    Object obj2 = JSON.parse(objBytes);
    

YAML

YAML(/ˈjæməl/)

可读性高,用于表达数据序列化的格式。

  • 历史
    • Clark Evans 在 2001 年 5 月首次发表,Ingy döt Net 与 Oren Ben-Kiki 是共同设计者。
    • 参考语言:C语言、Python、Perl、XML、RFC 2822
  • 命名
    • YAML Ain't a Markup Language(YAML 不是标记语言):强调 YAML 以数据为中心
    • Yet Another Markup Language(仍是标记语言):YAML 本质上还是一种标记语言。

2.1、语法

语法

  • 层级关系:通过空格(缩进)和换行表示,相同层级的元素左对齐。
  • 注解# 单行注解
  • 大小写敏感,键值对之间有空格
  • 使用 --- 分隔单个文件的多段 yaml 配置。

数据类型

  • 纯量

    • 单个不可再分的值(字符串、布尔值、整数、浮点数、null、时间、日期)

    • 字符串默认不需要引号,有特殊字符时需使用。

    • 日期值默认 ISO-8602 格式(yyyy-MM-dd

      # 字符串
      c0: jaywee
      # 布尔类型
      c1: true (或者True)
      # 整型
      c2: 234
      # 浮点型
      c3: 3.14
      # null类型:~表示null
      c4: ~
      # 日期类型
      c5: 2018-02-17
      # 时间类型:日期T时间+时区
      c6: 2018-02-17T15:02:31+08:00
      
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)

    # 推荐
    user1:
      name: jaywee
      age: 7
    # 内置格式(了解)
    user2: { name: jaywee,age: 7 }
    
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

    # 推荐
    pets1:
      - cat
      - dog
    # 内置格式(了解)
    pets2: [ cat,dog ]
    

2.2、语言比较

YAML 参考了 JSON,XML 等语言,不过 YAML 仍有自己的特色。

vs JSON

  • JSON 语法是 YAML 1.2 的子集,非常接近 YAML1.0 与 1.1 的子集
    • 因此大部分 JSON 文件都可以被 YAML 的剖析器剖析。
  • JSON 语法结构和 YAML 的内置格式相同
    • 大范围的分层(如 list 中有很多个成员)可以使用类似 JSON 的内置格式;
    • YAML 标准不建议这样使用,除非能增加可读性。
  • YAML 的许多扩展在 JSON 是没有的
    • 进阶资料形态
    • 关系锚点
    • 字符串不需要双引号
    • 映射资料形态会储存键值的顺序
    • ...

vs XML

YAML 比 XML 语法简洁得多(无需关注标签或引号),并且比 ini 文档功能更强。

但是由于兼容性问题,不同语言间的数据流转建议不要用 YAML

  • YAML 中没有 XML 的标签概念,以资料的可扩展性作为替代。
    • 在 YAML 规范中,没有类似 XML 的语言定义文件纲要(language-defined document schema descriptors),如验证结构是否正确的文件;
    • 不过,存在 YAML 纲要描述语言(YAML schema descriptor language)。
  • YAXML
    • 用 XML 描述 YAML 的结构:可以让 XML Schema 与 XSLT 转换程式应用在 YAML 之上;
    • 在一般使用的情况下,YAML 已经提供了足够的方式来辨认YAML 文件是否正确。
posted @ 2021-08-12 15:26  Jaywee  阅读(289)  评论(0编辑  收藏  举报

👇