2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于如何使用本网站的信息。

0
Clojure
重新标记

我有一段时间没有写Clojure代码了,所以对我来说有点生疏。

基本上,我正在尝试编写一段代码,该代码执行REST API的HTTP GET操作并将JSON数组的对象转换为Clojure数据(列表映射?)。该JSON数据看起来像这样:

[
    {
        "id": 1,
        "category": "technical",
        "asin": "0131103628",
        "title": "C Programming Language, 2nd Edition",
        "publication_date": "1988-04-01T00:00:00Z",
        "review": "The C book.",
        "created_at": "2020-03-06T20:48:00Z"
    },
    {
        "id": 2,
        "category": "technical",
        "asin": "0387966080",
        "title": "The Science of Fractal Images",
        "publication_date": "1988-07-19T00:00:00Z",
        "review": "The book on fractal algorithms.  Sadly, no longer in print.  I had to search high and low for a used copied.",
        "created_at": "2020-03-06T20:48:00Z"
    },
    // etc..
]

我使用http-kit(我也尝试过clj-http)调用REST API并返回响应体。稍后,我将响应体转换为Clojure数据。我尝试使用org.clojure/data.jsoncheshire。然而,我认为数据转换并不正确。

(defn get-books-body
  []
  (:body @(client/get books-url api-options)))

(defn get-books
  []
  (parse-string get-books-body true))

当我尝试显示响应体的类型时,它显示为一个地址而不是字符串

clojure-json-test.core=> (type get-books-body)
clojure_json_test.core$get_books_body

而且,在从JSON转换后,我看不见第一条记录

clojure-json-test.core=> (first get-books)
Execution error (IllegalArgumentException) at clojure-json-test.core/eval3169 (form-      init15378865171954877190.clj:1).
Don't know how to create ISeq from: clojure_json_test.core$get_books

你有什么建议吗?

1 答案

0

选中
 
最佳答案

在你的示例中,你将typefirst属性分别应用于函数对象get-books-bodyget-books,而不是调用这些函数。

同样的问题存在于get-books的定义中,你没有向parse-string传递一个字符串,而是传递了由变量get-books-body引用的函数对象。函数对象实际上是clojure中的有效数据,所以这是合法的(这就是为什么函数的类型是clojure_json_test.core$get_books_body——它是实现此命名空间中clojure函数的类),并且尝试将first应用于函数对象(而不是调用的函数可能会返回的期望的解析JSON序列结果)会失败,因为clojure函数不实现序列协议。

我将修改get-books,使其确实调用函数以获取字符串结果

(defn get-books
 []
 (parse-string (get-books-body) true))

然后类似地尝试使用函数调用执行测试

(type  (get-books-body))
(first (get-books))
谢谢!我很高兴这是件简单的事情。我想在我离开Clojure期间,我忘记了函数需要被括号包围。
...