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

欢迎!请参阅关于 页面以了解有关工作方式的更多信息。

0
命名空间和变量

我完全是 Clojure 的初学者,我正在尝试使用 Slurp 和 JSON 进行一些基本操作。

我找到了一些代码(不起作用),我把它作为示例来尝试学习一些基本知识。
以下代码应该从 Ipinfo.io 获取一些 JSON 数据,然后仅取出其中的 City 名称并打印。
我在命名空间中遇到了如此多的错误,以至于我甚至无法测试代码。 :-(

任何帮助都将非常感激! :-)
Jason

(ns my-namespace

(:require [clojure.core :as core]
			[clojure.data.json :as json]))

(defn get-city [ip-addr]

(let [resp (core/slurp (str "https://ipinfo.io" ip-addr "/json"))
	city-name (->> resp 
			(json/read-str)
			:city)]
(core/prn city-name)
city-name))

1 个答案

0

你几乎就完成了!几点注意事项

  1. 你不需要 require clojure.core,在每个命名空间中它都是自动导入的,所以只需要

    (ns my-namespace (:require [clojure.data.json :as json]))

就足够了。

  1. 你似乎缺少主机名后的斜杠 /。

  2. 默认情况下,data.json 将以字符串键读取 JSON,因此上面除了 :city 部分外都正常工作。在 Clojure 中与 REPL 交互式工作有助于逐步进行,你可以快速看到 read-str 返回了一个具有字符串键的映射。

  3. 要查找该函数的文档,请使用 (doc json/read-str) 来查看文档字符串,它引用了 read 功能,在以下位置进行记录:(doc json/read)。存在一个 :key-fn 选项,默认为 identity,但你可以使用 keyword 函数来构建关键字键。一旦完成,你就会想使用 -> 而不是 ->> 来复合。

将这些放在一起

(ns my-namespace
  (:require [clojure.data.json :as json]))

(defn get-city [ip-addr]
  (let [resp (slurp (str "https://ipinfo.io/" ip-addr "/json"))
        city-name (-> resp 
                      (json/read-str :key-fn keyword)
                      :city)]
    city-name))
尝试了这个方法但仍然出现ns错误。这是我得到的……

user=> (ns my-namespace (:require [clojure.data.json :as json]))
执行错误(FileNotFoundException)在 my-namespace/eval138$loading(REPL:1)。
无法在类路径中找到 clojure/data/json__init.class、clojure/data/json.clj 或 clojure/data/json.cljc。
此代码需要在类路径上使用 data.json 库。依赖信息可在https://github.com/clojure/data.json/#releases-and-dependency-information找到,但为了知道如何添加它,我需要了解您是如何启动REPL的。
我刚刚用  clj 启动了repl。
可能应该使用 lein
好的!我通过使用
clj -Sdeps '{:deps {org.clojure/data.json {:mvn/version "2.4.0"}}}' 启动 clj 后,使其运行。

程序仍有一些问题……
试验中……
我要将其分解
这行不通
(print (slurp (str "https://ipinfo.io/" ip "/json")))

但当我创建一个函数时,似乎无法正确传递IP
(defn mytest [ip]
(print (slurp (str "https://ipinfo.io/" ip "/json"))) )

mytest 24.80.129.110
#object[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
在(REPL:18:0)读取源代码时发生语法错误。
无效的数字:24.80.129.110

mytest "24.80.129.110"
#object[my_namespace$mytest 0x2e8a1ab4 "my_namespace$mytest@2e8a1ab4"]
"24.80.129.110"
by
在Clojure中调用函数时,总是需要将其括在括号中,并且IP将成为一个字符串以成为有效的值,因此

(mytest "24.80.129.110")
by
OMG!我真不敢相信我做了这件事!
谢谢!
...