客户端将EDN转换为JSON(HTML5应用程序使用的Datomic数据)

Client-side transform EDN to JSON (Datomic data consumed by HTML5 app)

本文关键字:Datomic 数据 应用程序 HTML5 EDN 转换 JSON 客户端      更新时间:2023-09-26

我正在实现从HTML5应用程序到Datomic数据库的基本端到端功能。第一种调用是让客户端直接对DatomicRESTneneneba API进行AJAX调用(http://docs.datomic.com/rest.html)。

这种方法需要解决的问题是,数据在EDN中返回,而客户端应用程序希望使用JSON。

我可以看到在客户端上使用Javascript可以实现这一点,例如,使用一些库代码来翻译EDN(例如,我发现jsedn-https://www.npmjs.com/package/jsedn)

有人有使用Javascript做这样的事情的经验吗?或者,是否更普遍地接受EDN到JSON应该在Clojure/Clojuescrapt领域(客户端或服务器端)中完成,如http://swannodette.github.io/2014/07/26/transit--clojurescript/?

感谢

Phil

【编辑2015年3月4日-澄清:通过客户端Clojuescrapt,我想到了一些类似于将EDN转换为JSON的CLJS代码,将其编译为JS,然后将其用作客户端库。]

你提到的jsedn项目没有任何反对意见,但它已经两年没有提交了,而且有几个长期存在的问题/PR没有得到解决:我会厌倦依赖它。

通过创建一个新的clojurescript项目和^:export,您可以很容易地实现您所追求的目标,该函数解析传入的edn并抛出JS对象(因为没有充分的理由取消对edn的序列化,将其序列化为JSON,然后再次取消对其的序列化!):

(ns app.edn (:require [cljs.reader :as r]))
(defn ^:export read-edn [s]
  (let [data (r/read-string s)]
    ; Log/prettify for JS/whatever
    (clj->js data)))

编译它,需要JS中的文件,它将在app.edn.read_edn()上可用。

如注释所示,以下是我为实现@SLD的正确答案而采取的全部步骤,以防任何人都能从细节中受益。

1) 从上面的答案中获取cljs代码。

2) 创建一个要在生成中使用的project.clj文件。我发现我不得不使用选项

:优化:空白

因此生成的代码对我来说是有意义的(并将加载在RequireJS中)

3) 使用命令

lein-cljsbuild一次

构建js文件。控制台输出将指示主生成文件的名称,该文件是project.clj 中指定的文件

4) (如果使用RequireJS)在RequireJS配置的"路径"中添加生成的文件

5) (如果使用RequireJS)为生成的文件添加一个"shim"条目,因为它不是模块。要获得正确的导出值,请查看3)中生成的js文件,并查看正在导出的全局对象。将该全局对象的名称添加为填充程序的"导出"值。