【仓颉三方库】 数据解析——yaml4cj

简介

yaml4cj 包使 cangjie 程序能够轻松地编码和解码 YAML 值,可以快速可靠地解析和生成 YAML 数据,参考地址:github.com/go-yaml/yam...

特性

  • 🚀 yaml4cj 包支持 YAML 1.1 和 1.2 的大部分内容,包括对锚点,标签,地图合并等的支持。

  • 🚀 多文档解组尚未实现,并且故意不支持来自 YAML 1.1 的 base-60 浮点数,因为它们设计很差,并在 YAML 1.2 中消失了。

  • 💪 yaml4cj v2 的包 API 将保持稳定。

  • 🛠️ v0.0.1版本迁移自 github.com/go-yaml/yam... Tags: v2.0.0

路线

架构

架构图

  • 编码并且解码 YAML 值。

  • 快速解析并生成 YAML 数据。

源码目录

css 复制代码
.
├── README.md
├── doc 
├── src
│   └── yaml
│       ├── alias_data.cj
│       ├── break_type.cj
│       ├── document.cj
│       ├── emitter_state_type.cj
│       ├── encoding_type.cj
│       ├── error.cj
│       ├── error_type.cj
│       ├── event_type.cj
│       ├── helper.cj
│       ├── mark.cj
│       ├── node.cj
│       ├── node_pair.cj
│       ├── node_type.cj
│       ├── parser.cj
│       ├── parser_state_type.cj
│       ├── privateh.cj
│       ├── simple_key.cj
│       ├── style_type.cj
│       ├── tag_directive.cj
│       ├── token.cj
│       ├── token_type.cj
│       ├── util.cj
│       ├── version_directive.cj
│       └── yaml_event.cj
│       ├── api.cj
│       ├── decode.cj
│       ├── emitter.cj
│       ├── encode.cj
│       ├── extends.cj
│       ├── parser.cj
│       ├── reader.cj
│       ├── resolve.cj
│       └── scanner.cj
└── test   
    ├── HLT
    ├── LLT
    └── UT
  • doc 存放库的设计文档、使用文档、LLT 用例覆盖报告(1.由于仓颉的编码自动转成 UTF8 ,所以有很多与编码格式相关的都覆盖不到;2.做冗余校验无法实际覆盖到)
  • src 是库源码目录
  • test 存放 HLT 测试用例、LLT 自测用例和 UT 单元测试用例

接口说明

主要核心类和全局函数说明,详情见 API

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。

erlang 复制代码
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

使用说明

编译

复制代码
cpm build -V

功能示例

yaml 解码示例

test_all.yaml 文件内容为

yaml 复制代码
#注释
#1-字典  键: 值
username: xiaoming  #冒号后面是空格
password: 123456
info: 配置  #中文---不建议使用,有可能会乱码
#字典嵌套
NAME_PSW:
  name: xiaoming
  password: 123456
#2-列表格式
list:
  - Ruby
  - Perl
  - Python 
#表嵌套
lists:
- 10
- 20
-
 - 100
 - 200
#3-列表中套字典
- 10
- 20
-
 name: tom
 password: 123456

#4-字典套列表
name: TOM
info1:
   - 10
   - 20
   - 30

#5-引号,果是有英文字母或者中文的,不加引号也是字符串
info2: "HELLO word"  #引号可以不加 

#什么加引号:如果有特俗字符\n 不加引号就原字符样式输出    如果显示特殊字符效果:就加双引号
info3: "HELLO\nwoord"

#6-引用 一个数据可以使用很多地方,使用变量
#& 变量名   定义变量
#*变量名   引用变量
name1: &a tom
name2: *a

#8-yamL文件可以有YAML
DATA: conf.yaml

# YAML格式
key: |+
  a
  b
  c
# 实际效果
"key": "a\nb\nc\n"

# YAML格式
key: |-
  a
  b
  c
# 实际效果
"key": "a\nb\nc"

# YAML格式
key: >+
  a
  b
  c
# 实际效果
"key": "a b c\n"

# YAML格式
key: >-
  a
  b
  c
# 实际效果
"key": "a b c"

javascript 复制代码
import yaml4cj.yaml.*
import std.os.posix.*
import std.io.*
import std.fs.*

main() {
    var path: String = getcwd()
    let pathname: String = "${path}/test_all.yaml"
    var fs: File = File(pathname, Open(true, true))
    if (fs.canRead()) {
        var res: Array<UInt8> = fs.readToEnd()
        fs.close()
        var jv = decode(res)
        println("---解码后---${jv.toString()}")
    } else {
        println("open fail")
    }
    return 0
}

执行结果如下:

swift 复制代码
---解码后---{"username":"xiaoming","password":123456,"info":"配置","NAME_PSW":{"name":"xiaoming","password":123456},"list":["Ruby","Perl","Python"],"lists":[10,20,[100,200],10,20,{"name":"tom","password":123456}],"name":"TOM","info1":[10,20,30],"info2":"HELLO word","info3":"HELLO\nwoord","name1":"tom","name2":"tom","DATA":"conf.yaml","key":"a b c"}

yaml 编码示例

test_all.json 文件内容为

swift 复制代码
{"username":"xiaoming","password":123456,"info":"配置","NAME_PSW":{"name":"xiaoming","password":123456},"list":["Ruby","Perl","Python"],"lists":[10,20,[100,200],10,20,{"name":"tom","password":123456}],"name":"TOM","info1":[10,20,30],"info2":"HELLO word","info3":"HELLO\nwoord","name1":"tom","name2":"tom","DATA":"conf.yaml","key111":true}

javascript 复制代码
import yaml4cj.yaml.*
import std.os.posix.*
import std.io.*
import std.fs.*
import encoding.json.*

main() {
    var path: String = getcwd()
    let pathname: String = "${path}/test_all.json"
    var fs: File = File(pathname, Open(true, true))
    if (fs.canRead()) {
        var res: String = String.fromUtf8(fs.readToEnd())
        fs.close()
        var encodeRes: Array<UInt8> = encode(JsonValue.fromStr(res))
        var decodeRes: String = decode(encodeRes).toString()
        if(res == decodeRes) {
            println("---success---")
        }

    } else {
        println("open fail")
    }
    return 0
}

执行结果如下:

css 复制代码
---success---

约束与限制

在下述版本验证通过:

yaml 复制代码
Cangjie Version: 0.53.4
相关推荐
xq95272 小时前
鸿蒙next 获取验证码输入框 重磅来袭
harmonyos
HMSCore3 小时前
如何实现应用内支付零掉单?
harmonyos
zhangmeng3 小时前
一文带你读懂鸿蒙Stage模型开发运行期和编译期概念
harmonyos·arkts·arkui
梁下轻语的秋缘7 小时前
HarmonyOs学习 环境配置后 实验1:创建项目Hello World
学习·华为·harmonyos
少年的云河月7 小时前
OpenHarmony Camera开发指导(五):相机预览功能(ArkTS)
harmonyos·openharmony·camera·相机开发
Hello_MyDream7 小时前
鸿蒙语言基础
华为·harmonyos
杯莫停丶7 小时前
对象池模式在uniapp鸿蒙APP中的深度应用
uni-app·harmonyos·鸿蒙
simple_lau8 小时前
浅谈鸿蒙多线程
harmonyos·arkts·arkui
simple_lau8 小时前
鸿蒙开发如何与穿戴设备通讯
harmonyos·arkts·arkui