Clojure API中正确的JSON转义

问题描述

我有一个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解码器无法读取。

如何避免这种情况?如何通过API端点将内部函数生成的完全转义的JSON值获取到Elm前端解码器中?

解决方法

JSON允许您escape forward slashes /和其他字符,以防止诸如</之类的内容在HTML中弹出。

write-str具有一个:escape-slash布尔选项:

:转义斜线布尔值

如果为true(默认值),则斜杠/被转义为\ /

因此您可以改写

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