Sign in

    moonata

    JSONata rewritten in moonbit.

    Download zip
    Author
    Version
    0.9.0
    License
    Apache-2.0
    Last updated
    3 months ago
    Downloads
    45

    #Moonata

    CI

    Moonata 是 JSONata 的 MoonBit 实现。JSONata 是一门面向 JSON 数据的查询与转换语言。

    本项目目前提供解析器、求值器、内建函数注册表、对外 facade API 与 native CLI。项目仍在对齐上游 jsonata-js 官方测试集,因此当前状态是“可用但尚未完全替代原版 JSONata”。

    #功能

    • JSONata 表达式解析与求值。
    • 路径遍历、谓词、通配符、递归下降、变量、块表达式、Lambda、部分应用与函数链。
    • 对象、数组、字符串、数值、布尔、日期时间、正则与高阶内建函数。
    • Facade API:evaluate(expr, data) 与 compile(expr).run(data)。
    • Native CLI,支持 --data 与 --file 输入模式。
    • MoonBit 包结构与生成的 .mbti 接口文件。

    #CLI

    构建 native 命令:

    moon build cmd/main --target native

    对 JSON 文件运行表达式:

    _build/native/debug/build/cmd/main/main.exe '$sum(Account.Order.Product.(Price * Quantity))' --file cmd/main/test.json

    针对 cmd/main/test.json 的示例表达式:

    Account.'Account Name' -> "Firefly" $sum(Account.Order.Product.(Price * Quantity)) -> 336.36

    #库 API

    在 MoonBit 代码中调用时,使用根包 facade:

    ///|
    let data = @json.parse("{\"items\":[{\"price\":10},{\"price\":20}]}")

    ///|
    let result = @moonata.evaluate("$sum(items.price)", data)

    需要重复求值时,可先编译一次:

    ///|
    let expr = @moonata.compile("$sum(items.price)")

    ///|
    let result = expr.run(data)

    上述 API 会在语法、运行时、类型、签名与护栏错误时抛出 JsonataError。

    #开发

    常用验证命令:

    moon check moon test moon fmt moon info

    提交代码变更前,应运行完整本地门禁,并检查生成的 .mbti diff 是否符合预期。提交信息使用 Conventional Commit 风格,例如:

    feat(functions): add basic formatNumber support fix(evaluator): align predicate context semantics docs: update official test status

    #CI

    仓库使用 GitHub Actions 执行以下门禁:

    • moon check --deny-warn:类型检查、语法检查,警告视为错误
    • moon fmt --check:格式校验
    • moon info:接口生成
    • moon build --deny-warn:构建,警告视为错误
    • moon test --deny-warn:测试执行,警告视为错误

    CI 在 master 分支推送、PR 以及手动触发时运行。

    #兼容性状态

    固定快照:2026-07-10,map 后位置谓词重置与重复父级跳过修正阶段。

    本地测试:moon test 206/206 官方可比对审计:eligible 1251, pass 1251, fail 0, skip 431 通过率:100%

    当前 CLI 可比对官方用例已全通过;剩余 skip 项为 harness/非字符串表达式/外部 bindings 等不可直接比较项。

    官方测试集审计流程与跳过策略记录在 docs/jsonata-official-workflow.md。

    Ast

    using @rinnein/moonata/ast { type Ast }

    JSONata AST 节点:单一 enum + 标签字段。

    所有节点统一为 Ast enum,子结构 Step/SortTerm 独立定义。 路径访问统一用 Path(Array[Step]) 表示,Step 携带 StepKind 与 StepStage。

    JsonataError

    再导出关键类型

    Compiled

    pub(all) struct Compiled {
    ast :
    Ast

    }

    已编译的 JSONata 表达式。

    Compiled::run

    对已编译表达式求值。

    compile

    编译 JSONata 表达式为可重复求值的 Compiled。

    evaluate

    fn evaluate(expr : String, data : Json) -> Json raise
    JsonataError

    JSONata 表达式求值。

    解析并求值 JSONata 表达式,返回 JSON 结果。

    Source Files