Правильное экранирование JSON в Clojure API

#json #clojure #compojure

#json #clojure #compojure

Вопрос:

У меня есть функция Clojure, которая записывает содержимое вектора URL-адресов в JSON и возвращает это из конечной точки API. Эти данные конечной точки считываются декодером Elm JSON в интерфейсном приложении. Запуск этой функции Clojure напрямую дает мне следующее:

 (json/write-str ["http://www.example.com?param=value" "http://www.example2.com?param=value"])
  

Который возвращает:

 "["http:\/\/www.example.com?param=value","http:\/\/www.example2.com?param=value"]"
  

Замечательно! Если я введу этот результат непосредственно в декодер Elm, такой как этот:

 stringArrayDecoder : Json.Decoder.Decoder (List String)
stringArrayDecoder =
Json.Decoder.list Json.Decoder.string
  

Он успешно анализирует его без ошибок.

Однако, когда я просматриваю ответ JSON из конечной точки, он теряет часть экранирования, и я получаю это:

 ["http://www.example.com?param=value","http://www.example2.com?param=value"]
  

Которое мой декодер Elm не может прочитать.

Как мне избежать этого? Как я могу получить полностью экранированные значения JSON, созданные моей внутренней функцией, через конечную точку API и в мой декодер интерфейса Elm?

Ответ №1:

JSON позволяет вам экранировать косые черты / и другие символы, чтобы предотвратить появление таких вещей, как </ в html.

write-str имеет :escape-slash логическую опцию:

: логическое значение escape-косой черты

Если значение true (по умолчанию), косая черта / экранируется как /

Таким образом, вы можете вместо этого написать

 (json/write-str ["http://url.one" "http://url.two"] :escape-slash false)
=> "["http://url.one","http://url.two"]"
  

Комментарии:

1. Допустимый обходной путь — тем не менее, я хотел бы, чтобы это было рассмотрено на стороне elm, если это мой проект.

2. Я попробовал это, и этот декодер Elm работает… хотя ошибка > my = Json. Decode.decodeString (Json. Декодирование. перечислите Json. Decode.string) j Ok [» example.com?param=value»,»http://… : Результат Json. Декодирование. Ошибка (строка списка)

3. Спасибо за вашу помощь @Remy. Я также могу проанализировать прямой вывод этой обновленной команды write-str, хотя я все еще вижу проблему, о которой я упоминал, когда она теряет внешние двойные кавычки при возврате из API. Я могу задать отдельный вопрос относительно декодера Elm, который будет работать для массива JSON без кавычек, или лучше указать мою проблему. Однако ваш ответ был полезен сам по себе, поэтому я пометил его как таковой!

4. Ах, хорошо, теперь я лучше понимаю вопрос. Возможно, путаница заключается в том, что write-str на самом деле делает, что отличается от того, что возвращает API. Я бы посоветовал вам использовать write вместо этого и создать свой декодер на основе этого.