本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第1章,第1.4节将JSON数据读入Incanter数据集,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
1.4 将JSON数据读入Incanter数据集
另一个越来越流行的数据格式是JavaScript Object Notation(JSON,详见http://json.org/)。与CSV相似,JSON也是无格式的文本,因此程序容易处理。它提供了相对于CSV文件关于数据的更多信息,但是代价是更冗长。JSON格式允许用更复杂的方式使数据结构化,例如层次结构或者序列层次结构。
由于JSON是比CSV更完善的数据模型,因此使用时可能需要转换数据。在这种情况下,可以将感兴趣的信息取出,在传入Incanter之前精简嵌入的映射。然而这种方法仅用于处理相当简单的数据结构。
1.4.1 准备工作
首先,在Leiningen的project.clj文件中包含以下依赖:
在REPL解释器或程序中使用下列库:
1.4.3 实现原理
和所有的Lisp语言相似,Clojure通常采用从内层到外层、从右到左的方式读取数据。接下来详细说明。clojure.core/slurp将读入文件内容并以字符串的形式返回。对于非常大的文件来说这明显不是个好主意,但是对小文件来说却很实用。clojure.data.json/read-json从slurp中得到数据,将其以JSON格式进行解析,并返回本地的Clojure数据结构。在本例中,它返回一个由向量组成的映射。maps.incanter.core/to-dataset读入一个映射序列,然后返回Incanter数据集。这将会使用映射中的键作为列名并将数据值转换成矩阵。事实上,to-dataset可以接收许多不同的数据结构。在REPL解释器上尝试(doc to-dataset)命令,或者登录http://data-sorcery.org/contents/查看Incanter文档中的详细内容。