Babashka:在 json 文件列表中输出有效 json

Babashka: output valid json in a list of json file

我输入了一个 jsons 文件列表(比如说 in.jsons):

{"a": "foo", "b": "bar"}
{"a": "bar", "d": "baz"}
...

我想生成一个具有相同格式的文件,应用一些转换 (my-awesome-fn)。我想使用 babashka。我的第一感觉是一个简单的 bash 管道:

cat in.jsons | bb -i --stream script.clj > out.jsons

其中 script.clj 看起来像:


(require '[cheshire.core :as json])

(let  [in (json/parse-string *input* true)
       out (my-awesome-fn in)]
      (json/generate-string out))

我希望在 out.jsons 文件中看到的内容

{"aa": "faa", "bb": "bor"}
{"aa": "bii", "dd": "bla"}
...

我在 out.jsons 文件中得到了什么

"{\"aa\": \"faa\", \"bb\": \"bor\"}"
"{\"aa\": \"bii\", \"dd\": \"bla\"}"
...

我能理解:我把我的数据转成字符串再转成标准输出。

如果我使用 generate-stream 和适当的 io writer 而不是 generate-string,我会得到类似的东西:

{"aa": "faa", "bb": "bor"}#object[java.io.BufferedWriter 0x13e21dd4 "java.io.BufferedWriter@13e21dd4"
{"aa": "bii", "dd": "bla"}#object[java.io.BufferedWriter 0x13e21df5 "java.io.BufferedWriter@13e21df5"
...

这个结果我也能理解。回到 bash.

时,我从未将我的流对象转换为字符串

但我不知道如何解决我的问题。有人可以帮我吗?

如果我理解正确,没有 -o Babashka 会打印您的函数的结果,它是一个字符串。但是,如果您添加 -o,它会打印解释为 "lines of text" 的结果,这就是您想要的结果。

因此,要解决您的问题,您只需将 -o 添加到传递给 bb 的选项中:

cat in.jsons | bb -i -o --stream script.clj > out.jsons