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

欢迎!请参阅关于页面以获取更多关于这是如何工作的信息。

0
命名空间和变量

我是Clojure的初学者,正在尝试使用Slurp和JSON做一些基本的事情。

我找到了一些代码(不起作用),我将其用作示例来尝试学习一些基础知识。
以下代码的目的是从Ipinfo.io获取一些JSON数据,然后从中拉取仅包含城市名称并打印出来。
我遇到了很多命名空间错误,以至于我甚至无法测试实际的代码。:(

任何帮助都将受到极大的欢迎!:-)
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,它在每个命名空间中都是自动require的,所以只需

    (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函数来构建关键字键。一旦你这么做,你想使用->而不是->>来thread first。

把所有这些都放在一起

(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]))
在 my-namespace/eval138$loading (REPL:1) 处发生执行错误 (FileNotFoundException)。
无法在类路径上找到 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使其运行:
clj -Sdeps '{:deps {org.clojure/data.json {:mvn/version "2.4.0"}}}'

程序仍然有一些问题...
实验中...
我在分解它
这有效
(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!我简直不敢相信我做了那件事!
谢谢!
...