如何将 hylang s-expression 序列化为 PostgreSQL json/json-b?

问题描述

我们正在尝试将 hylang 作为 DSL 用于某些金融业务流程。我们试图将业务规则用作 JSON,但切换到使用 hy 语言的 DSL。现在我们需要像以前的 JSON-B 项目一样将 s-expression 项目持久化到 postgresql 中。有没有标准的方法来做到这一点,或者我们必须使用文本字段?

一个

  "conditions": {
    "all": [
        {
            "name": "order_create_date","value": 1620675000,"operator": "greater_than_or_equal_to"
        },{
            "name": "order_create_date","value": 1624217400,"operator": "less_than_or_equal_to"
        }
  }

当前:

(defn check_condition [params] (
                            and (> params.order_create_date "2021/06/22") (< params.order_create_date "2021/07/22"))

)

解决方法

确实没有标准的方法可以做到这一点;在 Hy 或 Postgres 方面没有实现任何特别的东西。除非你有大量的这些,或者它们非常大,或者你想对它们进行某种花哨的搜索或索引,将它们存储为文本应该很好。事实上,我更喜欢平面文件而不是数据库。

另一种选择是利用 Postgres 的 JSON 支持并设计您自己的小方法来在 Hy 模型树和 JSON 之间进行转换。例如,Hy 表达式可以表示为 JSON 数组。 Python 的 json 库可以帮助解决这个问题,例如defaultJSONEncoder 参数。