客户端将 EDN 转换为 JSON(HTML5 应用消耗的数据)

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

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

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

我看到有一些可能的方法可以在客户端使用 Javascript 来完成它,例如,使用一些库代码来翻译 EDN(例如,我找到了 jsedn - https://www.npmjs.com/package/jsedn)

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

谢谢

菲尔

[编辑 2015 年 3 月 4 日 - 澄清: 通过客户端 Clojurescript,我正在考虑采用将 EDN 转换为 JSON 的 CLJS 代码,将其编译为 JS,然后将其用作客户端库。]

你提到的 jsedn 项目没有任何问题,但它已经两年没有提交了,并且有几个长期存在的 issues/PR 没有得到处理:我会厌倦了依赖它。

您可以通过创建一个新的 clojurescript 项目和 ^:export-ing 一个解析传入的 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 文件。 console out 会显示主要生成文件的名称,也就是project.clj

中指定的那个

4)(如果使用 RequireJS)将生成的文件添加到 RequireJS 配置的 "paths"

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