2015-03-04 2 views
4

Я реализую базовые сквозные функции из приложения HTML5 в базу данных Datomic. Первый порт-вызов состоит в том, чтобы клиент вызывал вызов AJAX непосредственно в Datomic REST API (http://docs.datomic.com/rest.html).Преобразование на стороне клиента EDN в JSON (данные, используемые приложением HTML5)

Проблема, которая должна быть решена с помощью этого подхода, заключается в том, что данные возвращаются в 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/?

Благодаря

Phil

[редактировать 04-Mar-15 - уточнение: По стороне клиента Clojurescript я имею в виду что-то вроде принимая CLJS код, который преобразует EDN в JSON, компиляции вниз к JS, затем используя его в качестве библиотеки на стороне клиента.]

ответ

3

Ничего против проекта jsedn, о котором вы упоминаете, но он не видел совершения через два года и имеет пару давних проблем/PR, которые не были позаботился: я устал бы полагаться на это.

Вы можете легко получить то, что вам нужно, создав новый проект clojurescript и ^:export -в одной функции, которая анализирует входящие edn и выплевывает объекты JS (потому что нет веских оснований для десериализации edn, сериализуйте его в JSON , затем deserialise его снова!):

(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().

+1

Спасибо @SLD. Я сделал то, что вы предложили выше, и это сработало (и предоставило больше JSON-ey JSON, чем jsedn: jsedn использовало имена на основе имен Clojure, добавляя двоеточие и включая пути пространства имен). Мне потребовалось некоторое время, чтобы выяснить, как загрузить скомпилированный код с помощью RequireJS, поэтому я включил свои полные шаги ниже, если они будут полезны для кого-либо еще. – westwell

1

Как указано в комментарии, вот полные шаги, которые я предпринял для реализации правильного ответа @ SLD, в случае, если кто-то может извлечь выгоду из деталей.

1) Возьмите код cljs из приведенного выше ответа.

2) Создайте файл project.clj для использования в сборке. Я нашел, что я должен был использовать опцию

: Оптимизации: пробельная

так, что сгенерированный код имеет смысл для меня (и загрузит в RequireJS)

3) Используйте команду

Lein cljsbuild один раз

для создания файлов js. Консоль из укажет имя главного сгенерированного файла, который является один указанный в project.clj

4) (при использовании RequireJS) добавить сгенерированный файл в «пути» из RequireJS конфигурации

5) (при использовании RequireJS) добавьте «прокладку» для сгенерированного файла, так как это не модуль.Чтобы получить правильное значение для экспорта, загляните в сгенерированный файл js из 3) и посмотрите, какой глобальный объект экспортируется. Добавьте имя этого глобального объекта в качестве значения «экспорта» прокладки.