数据处理与转换
深层比较、递归合并、可校验补丁以及 JSON、TOML 和数据库文本互转。
言据标准库的数据操作都以言序原生值为输入,不要求先把值重新序列化成文字。
深复制与比较
深复制复制每个列和据节点,所得容器不与原值共享可变节点。相同递归比较值;据的键顺序不影响结果。
定 副本 为 言据.深复制(配置);
测试.断言(言据.相同(配置,副本),「副本应保持数据语义」);递归合并
合并两个据时,相同键下的据继续递归合并,其他值由覆盖侧替换。合并据提供明确的典返回类型:
定 默认配置:典 为 {
「服务」:{「主机」:「127.0.0.1」,「端口」:8080},
「标签」:【「默认」】
};
定 用户配置:典 为 {
「服务」:{「端口」:9090},
「标签」:【「用户」】
};
定 最终配置:典 为 言据.合并据(默认配置,用户配置);普通合并和合并据默认替换列。合并为的第三个参数可选:
| 策略 | 结果 |
|---|---|
替换 | 使用覆盖侧的列 |
连接 | 顺序连接两侧,保留重复项 |
去重 | 顺序连接,只保留每个深层值的首次出现 |
合并会深复制结果,不会改写任一输入。非法策略产生YJ_MERGE。
结构化差异
差异(旧值,新值)返回稳定排序的变化列。每项包含操作、路径段列路径、旧值和新值;操作是新增、删除或修改。
定 各差:列 为 言据.差异(默认配置,最终配置);
言 言据.美化(各差);差异适合审计、测试、展示变化,也可以作为 1.2 补丁入口的稳定输入。
校验并应用补丁
1.2 的应用差异与应用补丁重放差异结果。修改和删除前会比较补丁中的旧值,
避免静默覆盖已经变化的基础数据:
定 各差:列 为 言据.差异(旧配置,新配置);
定 已重放 为 言据.应用补丁(旧配置,各差);路径、操作、字段或旧值不合法返回YJ_PATCH;旧值冲突返回YJ_PATCH_CONFLICT。冲突时
重新读取基础值并计算新差异,不应移除旧值检查强行覆盖。重放深复制结果,不改写输入。
JSON 互转
定 值 为 言据.自JSON(JSON输入);
定 对象:典 为 言据.自JSON据(JSON输入);
定 数组:列 为 言据.自JSON列(JSON输入);
定 JSON输出:文 为 言据.转JSON(值);
定 言据原文:文 为 言据.JSON转言据(JSON输入);自JSON据和自JSON列会检查根类型。JSON 解析与序列化失败统一包装为YJ_JSON。言据转JSON和JSON转言据是两个文本格式之间的直接转换接口。
配置型 TOML 互转
定 配置:典 为 言据.自TOML(TOML输入);
定 TOML输出:文 为 言据.转TOML(配置);
定 言据原文:文 为 言据.TOML转言据(TOML输入);
定 TOML直转:文 为 言据.言据转TOML(言据输入);TOML 接口面向常见配置,支持单行键值、表、点分键、基础和字面文字、逻辑、十进制数、列、行内表及注释。输出按键稳定排序。
日期时间、非十进制数、指数、多行文字、表列以及 TOML 无法表示的空会产生YJ_TOML,不会静默改写或丢失类型。需要保存言据的完整值模型时,应继续使用.yj。
数据库规范文本
定 入库文:文 为 言据.数据库文本(值);
定 出库值 为 言据.自数据库文本(入库文);
定 已审计值 为 言据.自规范数据库文本(入库文);第一项生成确定的.yj文本,适合所有数据库的 TEXT/CLOB。严格入口在文本不是规范形式
时返回YJ_CANONICAL。数据库原生 JSON 是另一种结构化表示,导出.yj时仍要规范序列化。
持续传输多个值时,不要手工拼接容器,使用言据流。