2024 Clojure状况调查!中分享你的想法。

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

0
Clojure
重新标记

我有一段时间没有写Clojure程序了,所以有点生疏。

基本上,我正在尝试编写代码,对REST API执行HTTP GET请求,然后将该JSON对象数组转换为Clojure数据(Map列表?)。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))
by
谢谢!我很高兴这只是一个简单的问题。我想在我离开Clojure的时候,我忘记了函数需要用括号括起来。
...